这是从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作为流输入到标准库的字符串流中,然后将其输出为Target对象的流。
2> Source是可输出流
3> Target是可输入流
问题1> 对于用户定义类型(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&
的引用?
lexical_castable::read_
是一个常量成员函数是一个错误。 - q0987lexical_castable::print
包含一个 '\n' 是一个 bug。 - q0987