q09*_*987 8 c++ 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;
}
Run Code Online (Sandbox Code Playgroud)
根据文件,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
Run Code Online (Sandbox Code Playgroud)
1>将流arg的结果返回到基于标准库的字符串的流中,然后作为Target对象返回.
2> Source是OutputStreamable
3> Target是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_cast,只需为其定义"流"运算符.来自Boost.LexicalCast简介:
- Source是OutputStreamable,意思
operator<<是定义了一个左侧的一个std::ostream或一个std::wostream对象,右侧是一个参数类型的实例.- Target是InputStreamable,意味着
operator>>定义了一个左侧的一个std::istream或一个std::wistream对象,右侧是一个结果类型的实例.- 目标是CopyConstructible [20.1.3].
- Target是DefaultConstructible,这意味着可以默认初始化该类型的对象[8.5,20.1.4].
:
// either inline friend, out-of-class friend, or just normal free function
// depending on whether it needs to access internel members
// or can cope with the public interface
// (use only one version)
class MyClass{
int _i;
public:
// inline version
friend std::ostream& operator<<(std::ostream& os, MyClass const& ms){
return os << ms._i;
}
// or out-of-class friend (friend declaration inside class only)
friend std::ostream& operator<<(std::ostream& os, MyClass const& ms);
// for the free function version
int get_i() const{ return _i; }
};
// out-of-class continued
std::ostream& operator<<(std::ostream& os, MyClass const& ms){
return os << ms._i;
}
// free function, non-friend
std::ostream& operator<<(std::ostream& os, MyClass const& ms){
return os << ms.get_i();
}
Run Code Online (Sandbox Code Playgroud)
当然也是如此operator>>.
| 归档时间: |
|
| 查看次数: |
4144 次 |
| 最近记录: |