据我所知,C ++模板类reference_wrapper
对容器和元组中的引用很有用,因为它实际上为普通引用提供了一个copy-constructor和赋值运算符。换句话说,它似乎就像一个不允许null的指针。
基于这种理解,我尝试实现一个默认情况下将字符串打印到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?