启用类以与boost :: lexical_cast一起使用

时间:2011-12-25 16:30:01

标签: 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;
}

基于document

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);
  

1&GT;将流arg的结果返回到标准库中   基于字符串的流,然后作为Target对象。

     

2 - ;来源是OutputStreamable

     

3&GT;目标是InputStreamable

问题1 &GT;对于用户定义类型(UDT),OutputStreamable或InputStreamable是否必须始终处理std::string?例如,给定一个包含简单整数作为成员变量的类,当我们定义operator<<operator>>时,实现代码是什么样的?我必须将整数转换为字符串吗?根据我的理解,似乎UDT始终必须处理std::string才能使用boost::lexical_castboost::lexcial_cast需要中间std::string来执行真正的转换作业。

问题2 &GT;上述代码中operator<<operator>>的返回值为何不分别引用std::ostream&std::istream&

1 个答案:

答案 0 :(得分:7)

要使您的课程与lexical_cast一起使用,只需为其定义“流”操作符即可。 来自Boost.LexicalCast Synopsis

  
      
  • 来源为OutputStreamable,意味着定义了 operator<< ,其中包含 std::ostream std::wostream 左侧的对象和右侧的参数类型的实例。
  •   
  • 目标是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();
}

operator>>当然也是如此。

相关问题