3

ostream にプレフィックスを追加する方法を探しています。それを他の関数に渡して、出力にプレフィックスを付け、それを削除して続行します。

次の疑似コードを確認してください。

...
void function(ostream &out){
    out << "output 1\n";
    out << "output 2\n";
}

cout << "Whatever\n";
add_suffix(cout,"function: ");
function(cout);
remove_suffix(cout);
...

次のような出力で:

...
Whatever
function: output 1
function: output 2
...

ostream のドキュメントを見ると、セントリーはプレフィックス/サフィックスに使用される可能性があると記載されていますが、意図した用途が私が望むものである場合、これを行う方法がわかりません。

ostream::sentryドキュメントには次 のように記載されています。

sentry: Perform exception safe prefix/suffix operations
4

2 に答える 2

4

一般的な方法は次のようになります。これは、書き込まれた改行の後にプレフィックスを挿入し、出力を宛先バッファーに送信する を定義YourStreamBufferします。streambuf次に、次のように使用します。

streambuf *oldBuf = cout.rdbuf();

YourStreamBuffer yourBuf(oldBuf, "function: ");
// everything written to yourBuf is sent to oldBuf

cout.rdbuf(&yourBuf);
function(cout);
cout.rdbuf(oldBuf);

ストリーム バッファの実装方法については、ネット上で多くの例を見つけることができます。また、コードが例外に対して安全であることを確認してください。つまり、例外がスローされた場合でも oldBuf を復元してください。

注: 歩哨は別のものです。ここで必要なものではありません。

于 2010-12-18T21:10:42.650 に答える
0

または、これに邪悪なマクロを使用することもできます..

#define f_str(str) str << __FUNCTION__ << ' '

(はい、__FUNCTION__どこでも定義されているわけではありませんが...) マイナスは、マクロを使用してラップする必要があることです。プラスは、チェーンされたすべてのストリーム操作に対して名前を 1 回だけ挿入することです (ストリーム バッファーの場合、それは 'すべての新しい行に接頭辞があります[もちろん、それが必要な場合を除きます!])

于 2010-12-18T21:25:34.893 に答える