据我了解,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?