给一个班级
class ostreamWrapper
{
private:
ostream * str;
public:
ostreamWrapper operator << (const char *);
}
Run Code Online (Sandbox Code Playgroud)
where ostream * str将指向std :: cout ostreamWrapper operator << (const char *)并将给定文本发送到包装的ostream str.
在这种情况下,我只能instance << "const char * text",没有其他可打印的数据.与直接<<使用std :: cout或std :: cerr不同.
如何实现operator方法,以便接受任何类型的数据,就像std :: cout或std :: cerr一样?
首先,编写一个公共operator<<模板,以便它可以接受任何类型,并简单地将其转发给包装ostream.
template <class T>
ostreamWrapper& operator<<(T&& x) {
*str << std::forward<T>(x);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
其次,为了接受插入流操纵器模板,例如std::endl,添加第二个公开operator<<,专门接受用于包装的操纵器ostream:
ostreamWrapper& operator<<(ostream& (*manip)(ostream&)) {
*str << manip;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
省略第二次重载将导致重载的操纵器或操纵器模板插入失败并出现"模糊过载"或类似的错误消息.
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |