我有一个带有公共(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/