15

テキストをリッチテキストボックス (Win32、C++) に出力するロガークラスが動作しています。問題は、私はいつも次のように使用することです:

stringstream ss;  
ss << someInt << someString;  
debugLogger.log(ss.str());

代わりに、次のようにストリームのように使用する方がはるかに便利です。

debugLogger << someInt << someString;

すべてを内部 stringstream インスタンスに転送するよりも良い方法はありますか? これを行う場合、いつフラッシュする必要がありますか?

4

5 に答える 5

34

operator <<クラスに適切に実装する必要があります。一般的なパターンは次のようになります。

template <typename T>
logger& operator <<(logger& log, T const& value) {
    log.your_stringstream << value;
    return log;
}

const操作はロガーを変更するため、これは (非) 参照を扱うことに注意してください。logまた、チェーンを機能させるには、パラメーターを返す必要があることに注意してください。

log << 1 << 2 << endl;
// is the same as:
((log << 1) << 2) << endl;

最も内側の操作が現在のインスタンスを返さなかったlog場合、他のすべての操作はコンパイル時に失敗するか (間違ったメソッド シグネチャ)、実行時に飲み込まれてしまいます。

于 2009-02-04T15:16:14.690 に答える
16

挿入演算子 << をオーバーロードする方法はありません。すべての endl またはその他のユーザー定義関数のオーバーロードを追加する必要があります。

進むべき道は、独自の streambuf を定義し、それをストリームにバインドすることです。次に、ストリームを使用するだけです。

以下にいくつかの簡単な例を示します。

于 2009-02-04T17:09:31.047 に答える
-1

Logger クラスで、 << 演算子をオーバーライドします。

<< 演算子の実装方法については、ここをクリックしてください。

アスペクト指向プログラミングを使用して、コード内のログ ステートメントを回避することもできます。

于 2009-02-04T15:16:11.040 に答える