【发布时间】:2013-04-04 16:30:02
【问题描述】:
我有一个带有公共方法的静态 C++ 类 Logger:
static std::ostringstream& Log(int sev);
您可以看到该方法评估为 ostringstream,因此我只需键入即可记录我的内容:
Logger::log(MY_SEVERITY) << "hello world";
由于编译器首先评估 log(MY_SEVERITY),然后评估整个表达式,我需要第二种方法:
static FVResult_t Flush();
实际将 ostringstream 的内容写入磁盘。 Flush() 必须在任何 Log() 调用之前调用,所以每当我想记录一些东西时,我必须依次调用这两个方法:
Logger::log(MY_SEVERITY) << "hello world";
Logger::Flush();
到目前为止一切顺利。
现在我的问题是,我想编写一个 C++ 宏,它结合了两种方法,让我可以做这样的事情:
LOGMACRO(MY_SEVERITY) << "hello world";
我试过了:
#define LOGMACRO(lev) \
Logger::Log(lev) \
Logger::Flush();
但是,正如我所料,C++ 编译器抱怨缺少 ostringstream。如何仅在我的宏中将此类 ostringstream 传递给 Logger::Log(lev)?
【问题讨论】:
-
似乎更好的方法是编写一个为您调用
Logger::Flush的iostream 操纵器。然后你可以写Logger::log(MY_SEVERITY) << "hello world" << flush_logger; -
为什么,这个里面有宏?插入运算符的要求表明宏表达的任何内容都必须返回某种
ostream&,而您的则不会。除非您正在记录行号和文件位置(我建议,顺便说一句),否则这里没有任何证据表明它们甚至是需要的?采用严重性并返回正确的ostream&的内联应该绰绰有余。 (我同意上面约翰的评论。) -
为什么不创建自己的
LogStream类,并在其中进行所有必要的刷新? -
@John:嗯,你怎么能确保最后调用 flush_logger()? C99 和 C11 都没有规定评估顺序(例如从左到右)
-
Flush_logger 不是一个函数,它是一个操纵器(在这种情况下是一个函数指针)。它将被最后调用,您认为 std::flush 或 std::endl 还能如何工作?
标签: c++ string logging macros stringstream