我偶然发现了一个我最初无法解释的奇怪行为(见ideone):
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::cout << "Reference : "
<< (void const*)"some data"
<< "\n";
std::ostringstream s;
s << "some data";
std::cout << "Regular Syntax: " << s.str() << "\n";
std::ostringstream s2;
std::cout << "Semi inline : "
<< static_cast<std::ostringstream&>(s2 << "some data").str()
<< "\n";
std::cout << "Inline : "
<< dynamic_cast<std::ostringstream&>(
std::ostringstream() << "some data"
).str()
<< "\n";
}
Run Code Online (Sandbox Code Playgroud)
给出输出:
Reference : 0x804a03d
Regular Syntax: some data
Semi inline : some …Run Code Online (Sandbox Code Playgroud) 我想实现具有以下特征的C++日志记录:
事情我并不需要的是:
cout样式表达式(例如"foo=" << foo).我只会通过一个std::string.我找到了这个答案,这似乎是为了满足我的需求,但这有点过头了.我认为我的困惑集中在仿函数上.(我读过维基百科的文章,但显然没有沉入其中.)
下面是我的部分就明白了:
#ifdef NDEBUG以保持被编译的记录通话(但我需要能够在运行时设置日志记录).__FILE__和__LINE__在点记录器被调用.static_cast<std::ostringstream&>.开头的表达式.我认为这纯粹与评估cout样式格式字符串有关,我不打算支持它.这是我在努力的地方:
Logger& Debug() {
static Logger logger(Level::Debug, Console);
return logger;
}
Run Code Online (Sandbox Code Playgroud)
阅读operator(),它看起来像class Logger用于创建"仿函数".每个Logger仿函数都使用级别和LogSink进行实例化(?).(你是否"实例化"一个仿函数?)LogSink被描述为"后端消费预先格式化的消息",但我不知道它会是什么样子或它是如何"写入"的.在什么时候实例化静态Logger对象?是什么导致它被实例化?
这些宏定义......
#define LOG(Logger_, Message_) \
Logger_( \
static_cast<std::ostringstream&>( \
std::ostringstream().flush() << Message_ \
).str(), \
__FUNCTION__, \
__FILE__, \
__LINE__ \
); …Run Code Online (Sandbox Code Playgroud)