фрагмент кода из lexical_cast:Включение классов для использования с повышением :: lexical_cast
class lexical_castable {
public:
lexical_castable() {};
lexical_castable(const std::string s) : s_(s) {};
friend std::ostream operator<<
(std::ostream& o, const lexical_castable& le);
friend std::istream operator>>
(std::istream& i, lexical_castable& le);
private:
virtual void print_(std::ostream& o) const {
o << s_ <<"\n";
}
virtual void read_(std::istream& i) const {
i >> s_;
}
std::string s_;
};
std::ostream operator<<(std::ostream& o,
const lexical_castable& le) {
le.print_(o);
return o;
}
std::istream operator>>(std::istream& i, lexical_castable& le) {
le.read_(i);
return i;
}
на основе document,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> Возвращает результат потокового ARG в стандартную библиотеку потоковый поток, а затем в качестве целевого объекта.
2> Источник является OutputStreamable
3> Target является InputStreamable
Question1> Для User Defined Type (UDT), если OutputStreamable или InputStreamable всегда приходится иметь дело с std::string
? Например, если класс, содержащий простое целое в качестве переменной-члена, когда мы определяем operator<<
и operator>>
, будет выглядеть код реализации? Нужно ли преобразовать целое число в виде строки? Основываясь на моем понимании, кажется, что UDT всегда имеет дело с std::string
, чтобы работать с boost::lexical_cast
, а boost::lexcial_cast
нуждается в промежуточном std::string
для выполнения реальных заданий преобразования.
Вопрос2> Почему возвращаемое значение operator<<
или operator>>
в коде выше, не ссылаться на std::ostream&
или std::istream&
соответственно?
Что код не возвращает ссылку, скорее всего, ошибка, так как потоки не могут быть скопированы. – Xeo
Это ошибка, из-за которой 'lexical_castable :: read_' является функцией-членом-константой. – q0987
Это ошибка, которую' lexical_castable :: print' включает в себя '\ n'. – q0987