如何重载运算符<<以像ostream所做的那样行事
How to overload operator << to act like what ostream does
我正在实现一个类,我想使用 <<将一些参数传递给实例。
例如
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;
}
如果确实需要修改参数,请使用与 <<
不同的方法。一个类似流的界面会在<<
期间修改流参数,这将是非常违反直觉和维护的噩梦。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<用于ostream语法
- 重载ostream&时转换错误无效;operator< & lt;
- 运算符<<(ostream&os,..)用于模板类
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 上Ostream & lt; & lt;重载的困惑