如何重载运算符<<像ostream那样行事

时间:2016-05-23 07:31:49

标签: c++ operator-overloading

我正在实现一个类,我想使用<<。

将一些参数传递给实例。

例如,

terminal term;
term << "Hello World!" << '\n';

代码如下,

class terminal {
    template <typename T>
    terminal& operator << (T& t) {
        std::cout << t;
        return *this;
    }
};

基本上,我想成为一个流而不是流的一部分。 (不是cout&lt;&lt; term;)

(抱歉,我忘了指明我的问题) 问题是,它适用于字符串,但如果有一个数字(如int,char等),它编译失败。

如果我们使用上面的例子,编译器会抱怨

  

二进制表达式的操作数无效(&#39;终端&#39;和&#39; int&#39;)

2 个答案:

答案 0 :(得分:2)

我会更改为以下内容,以便对operator<<(例如term << "hello" << std::endl;)的排序进行操作:

namespace foo {

class terminal {    
  std::ostream &strm;
public:
  terminal(std::ostream &strm_) : strm(strm_) {}
  terminal() : strm(std::cout) {}

  template <typename T>
  friend std::ostream& operator<<(terminal &term, T const &t);
};

template <typename T>
std::ostream& operator<<(terminal &term, T const &t) {
  term.strm << t;
  return term.strm;
}

}

Live Demo

答案 1 :(得分:1)

问题是你的operator <<通过引用非const来获取它的参数,这意味着它只能绑定到左值。所以像非字符串文字这样的东西就出来了。如果您不需要修改参数,请改为const &。该语言有一个特殊规则,允许对const的左值引用也绑定到右值。

terminal& operator << (const T& t) {
    std::cout << t;
    return *this;
}

如果你需要修改参数,请使用与<<不同的方法。类似于流的界面会在<<期间修改流式参数,这将是非常违反直觉和维护的噩梦。