我需要一个类,在其对象生命期内将一个 ostream 重定向到另一个 ostream。经过一些尝试,我想出了这个:
#include <iostream>
#include <fstream>
class ScopedRedirect
{
public:
ScopedRedirect(std::ostream & inOriginal, std::ostream & inRedirect) :
mOriginal(inOriginal),
mRedirect(inRedirect)
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
~ScopedRedirect()
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
private:
ScopedRedirect(const ScopedRedirect&);
ScopedRedirect& operator=(const ScopedRedirect&);
std::ostream & mOriginal;
std::ostream & mRedirect;
};
int main()
{
std::cout << "Before redirect." << std::endl;
std::ofstream filestream("redirected.txt");
{
ScopedRedirect redirect(std::cout, filestream);
std::cout << "During redirect." << std::endl;
}
std::cout << "After redirect." << std::endl;
return 0;
}
它似乎运行良好。但是,奇怪的是下面这行代码在构造函数和析构函数中都重复出现:
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
我认为代码是正确的,但我想请SO社区来验证一下。您能在这段代码中找到任何错误或危险吗?
编辑使其不可复制。
std::ostream
实现您的逻辑而不是直接调用std::cout
,那将更好。 - Billy ONeal