我有一个带有公共(public)方法的静态C++类Logger:

static std::ostringstream& Log(int sev);

如您所见,该方法的评估结果为ostringstream,因此我只需输入以下内容即可记录我的内容:
Logger::log(MY_SEVERITY) << "hello world";

由于编译器先评估log(MY_SEVERITY),然后评估整个表达式,所以我需要第二种方法:
static FVResult_t Flush();

实际将ostringstream的内容写入磁盘。必须在任何Log()调用之前调用Flush(),因此无论何时我想记录一些东西,我都必须依次调用这两个方法:
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)?

最佳答案

您只能使用以下宏

#define LOGMACRO(lev, msg) \
Logger::Log(lev) << msg; \
Logger::Flush();

使用方式
LOGMACRO(MY_SEVERITY, "hello world")

但是,我认为该功能或手动使用std::endl或使用您自己的操纵器会更好。

功能可以像这样
inline void log(int severity, const std::string& msg)
{
   Logger::Log(severity) << msg;
   Logger::Flush();
}

然后
log(MY_SEVERITY, "Hello!");

关于c++ - C++宏和std::ostringstreams,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15966391/

10-11 23:04