C ++流操作符重载。来自链接呼叫的1个结果

时间:2012-11-26 04:59:19

标签: c++ operator-overloading

我正在查看glog的文档,并对使用流操作符的方式感到困惑。

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

如何推断所有这些调用是否构成单个日志消息?

根据我的理解,这:

cout << foo << bar << baz;

相当于:

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

如何在没有特殊分隔符的情况下将链式调用组合在一起?

编辑:

我知道你可以链接它们,为什么有效,这不是我的问题。 我在问glog如何采取

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

对我来说,就像对<<重载的3次单独调用一样,知道

"Found 3 cookies"

是单个日志消息,而不是3。

1 个答案:

答案 0 :(得分: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);

修改

讨论之后,似乎问题更多的是关于gLog如何将每个日志分成没有终结符或任何endl类型对象的自己的日志条目。

从瞥见logging.h开始,每个单独的日志可能由不同的流对象写入。

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

这意味着在使用相同的日志对象时,您将写入相同的日志条目。每次调用Log实际上都会创建一个新的流对象。 RAII将负责实际编写已完成的日志,因为这是一个临时对象,它是destroyed after the line of code is executed

我需要更深入地了解代码以便更好地理解,但看起来这是一个准确的简短答案。问题仍然是(如果是这样)如何优化..