如何重载运算符<<以像ostream所做的那样行事

How to overload operator << to act like what ostream does

本文关键字:lt ostream 以像 重载 运算符 何重载      更新时间:2023-10-16

我正在实现一个类,我想使用 <<将一些参数传递给实例。

例如

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

代码如下,

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

基本上,我想成为一条溪流,而不是成为溪流的一部分。(不是<<术语;)

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

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

二进制表达式的操作数无效("终端"和"int")

我会更改为以下内容,以便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;
}
}

现场演示

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

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

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