Включение классов для использования с boost :: 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;
}
На основедокумент,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> Возвращает результат потоковой передачи аргумента arg в стандартный поток на основе строк библиотеки, а затем выводится как целевой объект.
2> Source is OutputStreamable
3> Цель - InputStreamable
Вопрос 1> Для определяемого пользователем типа (UDT), должен ли всегда иметь дело с OutputStreamable или InputStreamablestd::string
? Например, учитывая класс, содержащий простое целое число в качестве переменной-члена, когда мы определяемoperator<<
а такжеoperator>>
как выглядит код реализации? Должен ли я преобразовать целое число в строку? Исходя из моего понимания, кажется, что UDT всегда имеет дело сstd::string
для того, чтобы работать сboost::lexical_cast
а такжеboost::lexcial_cast
нужен промежуточныйstd::string
делать реальные конверсионные работы.
Вопрос 2> Почему возвращаемое значениеoperator<<
или жеoperator>>
в приведенном выше коде не ссылка наstd::ostream&
или жеstd::istream&
соответственно?