0

据我了解,C++ 模板类reference_wrapper对于容器和元组中的引用很有用,因为它本质上为普通引用提供了复制构造函数和赋值运算符。换句话说,它似乎是一个不允许为空的指针。

基于这种理解,我尝试实现一个std::cout默认打印字符串的类,但允许用户用文件覆盖它。这可能对任何现实世界的程序都没有用;我只是在这里举个例子。作为现代 C++ 的练习,我想避免使用 new/delete 并依赖 RAII 功能。下面是这个类的样子:

class Printer {
public:
    Printer() : myOut(std::cout)
    {}

    void print(string str)
    {
        myOut.get() << str << endl;
    }

    void setFileOutput(string path)
    {
        fileOutput.reset(new ofstream(path));
        myOut = *fileOutput;
    }

private:
    reference_wrapper<ostream> myOut;
    unique_ptr<ofstream> fileOutput;
};

一切都按预期工作,但这与reference_wrapper我在网上找到的示例完全不同。这是否被认为是有效的使用reference_wrapper?是否有更好的替代方案使用现代 C++ 功能,例如自动资源管理和 RAII?

4

0 回答 0