【发布时间】:2011-12-25 16:30:01
【问题描述】:
来自lexical_cast的代码sn-p:
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 的结果返回到标准库中 基于字符串的流,然后作为 Target 对象输出。
2> 源是 OutputStreamable
3> 目标是 InputStreamable
问题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_是const成员函数是个bug -
lexical_castable::print包含 '\n' 是一个错误。
标签: c++ boost lexical-cast