私が使用しているソフトウェア ライブラリは、大量のデバッグ出力を に書き込みますがstd::cerr
、静かにするように指示すると、その出力をヌル ストリームにリダイレクトします。main.cpp
これは、コードがこれを達成しようとする方法を示す簡略化されたものです。
#include <iostream>
#include <fstream>
#include <cassert>
// The stream that debug output is sent to. By default
// this points to std::cerr.
std::ostream* debugStream(&std::cerr);
// Throughout the library's codebase this function is called
// to get the stream that debug output should be sent to.
std::ostream& DebugStream()
{
return *debugStream;
}
// Null stream. This file stream will never be opened and acts
// as a null stream for DebugStream().
std::ofstream nullStream;
// Redirects debug output to the null stream
void BeQuiet()
{
debugStream = &nullStream;
}
int main(int argc, char** argv)
{
DebugStream() << "foo" << std::endl;
BeQuiet();
DebugStream() << "bar" << std::endl;
assert(debugStream->good());
return 0;
}
このプログラムを実行すると、文字列 "bar" がヌル ストリームに正しく送信されていることがわかります。ただし、アサーションが失敗することに気付きました。これは私が心配する必要があるものですか?それとも、これはライブラリ開発者が選択したアプローチのわずかに醜い詳細ですか?
気が向いたら、より良い代替案の提案を歓迎します。いくつかの制約:
/dev/null
ライブラリはクロスプラットフォームであるため、Windows では機能しないため、opening を使用することは有効な解決策ではないと思います- ライブラリは標準の C++ を使用するため、代替ソリューションではコンパイラ固有のものを使用しないでください。