正确的模板方法来包装ostream

Mar*_*rio 2 c++ ostream

给一个班级

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一样?

Bri*_*ian 5

首先,编写一个公共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)

省略第二次重载将导致重载的操纵器或操纵器模板插入失败并出现"模糊过载"或类似的错误消息.