だから、私はBoost.IOstreamsで見ていたし、ここで私が作ってみたものです:(stream_buffer-templateを参照)、ストリームバッファを作成するために使用することができ
class TestSink : public boost::iostreams::sink {
public:
std::streamsize write(const char * s, std::streamsize n) {
std::string message(s, n);
/* This would add a message to the log instead of cout.
The log implementation is threadsafe. */
std::cout << message << std::endl;
return n;
}
};
TestSink
。すべてのスレッドはそれ自身のインスタンスTestSink
を受け取りますが、すべてTestSinks
は同じログに書き込みます。次のようにTestSink
が使用されます。
TestSink sink;
boost::iostreams::stream_buffer<TestSink> testbuf(sink, 50000);
std::ostream out(&testbuf);
for (int i = 0; i < 10000; i++)
out << "test" << i;
out << std::endl;
ここで重要なことは、(std::endl
またはstd::flush
)ストリームがフラッシュされたときにTestSink.write
にのみ呼び出されること、である、またはstream_buffer
インスタンスの内部バッファがいっぱいになったとき(デフォルトのバッファサイズは40000文字を保持できないので、私は50000に初期化します)。このプログラムでは、TestSink.write
が1回だけ呼び出されます(出力が長すぎてここに投稿できません)。このようにして、通常のフォーマットされたstream-IOを使って、一時変数を使わずにlogmessageを書くことができます。ストリームをフラッシュすると、メッセージがログに1つずつ記録されます。
私は考えていないさまざまな提案や問題がある場合は、別の日に質問を残しておきます。
良い解決策のようですね!おそらく自分の答えとしてそれを追加しますか? –