Мне нужен класс, который перенаправляет один поток на другой поток во время его жизни. После некоторого мастерства я придумал это:
#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. Вы можете найти какие-либо ошибки или опасности в этом коде?
редактироватьСделать не скопированным.