0

glogのドキュメントを見ていましたが、ストリーム演算子の使用方法に混乱しました。

LOG(INFO) << "Found " << num_cookies << " cookies";

これらすべての呼び出しが 1 つのログ メッセージを形成すると、どのように推測できるのでしょうか?

私の理解から、これは:

cout << foo << bar << baz;

次と同等です。

cout << foo;
cout << bar;
cout << baz;

特別な区切り文字なしで、そのような連鎖呼び出しをグループ化するにはどうすればよいでしょうか?

編集:

私はあなたがそれらを連鎖させることができることを知っています、そしてなぜうまくいくのですか、それは私の質問ではありませんでした. 私はglogがどのように取ることができるか尋ねています

LOG(INFO) << "Found " << num_cookies << " cookies";

私にはオーバーロードへの3つの別々の呼び出しのように見え、<<それを知っています

"Found 3 cookies"

3 とは対照的に、単一のログ メッセージです。

4

1 に答える 1

2

cout << foo戻り値cout

したがって、それは次のようになります
cout << bar << baz;

等々。

それをより明確に見る別の方法は、

((cout.operator<<(foo)).operator<<(bar)).operator<<(baz);

これはまさに起こっていることです

これはhttp://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/から確認できます。

ostream& operator<< (double val);

編集

endl議論の後、ターミネータや型オブジェクトなしで、gLogs が各ログを独自のログ エントリに分離する方法についての質問が増えたようです。

を一瞥するlogging.hと、個々のログが異なるストリーム オブジェクトによって書き込まれている可能性があることがわかります。

#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()

これは、同じログ オブジェクトを使用している間、同じログ エントリに書き込むことを意味します。そして、Log を 1 回おきに呼び出すと、実際には新しいストリーム オブジェクトが作成されます。これは一時的なオブジェクトであり、コード行が実行された後に破棄されるため、 RAIIが実際に完成したログを書き込む処理を行います。

理解を深めるためにコードをさらに深く掘り下げる必要がありますが、これは簡単な答えであれば正確なようです。問題は、これが最適化されているかどうか (もしそうならどのように) 残っている..

于 2012-11-26T05:03:00.100 に答える