オブジェクトの存続期間中にostreamを別のostreamにリダイレクトするクラスが必要です。いくつかの微妙な調整の後、私はこれを思いついた。std :: coutをリダイレクトする
#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のコミュニティで検証したいと思います。このコードでエラーや危険を見つけることができますか?
編集コピー不可。
1 - それは正しいはずです - しかし、あなたは、一般的な面であなたのロジックを実装している場合、それは良いだろう'std :: cout'を直接呼び出すのではなく、' std :: ostream'を実行します。 –
@Billy ONeal:ScopedRedirectは一般的なostreamに関してすでに実装されていませんか? std :: coutはサンプルでのみ使用されます。 – StackedCrooked
私はあなたのクラスが悪いまたは間違っていると言っているわけではありません。私はちょうどあなたがそれが事実の後ろにどこにリダイレクトするよりも実際に行きたい出力に出力を送る方が良いだろうと言っています。つまり、私はstd :: coutに依存するコードは、特定の場所を指すのではなく、どこの場所を変更するかをリファクタリングする必要があると言っています。 –