【发布时间】:2016-07-06 16:52:09
【问题描述】:
我有一个struct 喜欢
struct log {
boost::mutex mut;
std::stringstream a_stringstream;
//...
};
在我的代码中,我有一个向量并且经常这样做
{
boost::lock_guard <boost::mutex> lock(logs[AN_ENUM].mut);
logs[AN_ENUM].a_stringstream << "something" << a_double << a_string << etc;
}
每次我想记录一些东西时,都有锁保护和括号似乎很冗长。起初我想也许我可以为我的结构重载 << 运算符,但我读过它,我认为这行不通。有什么好方法可以将其压缩为方法调用吗?
【问题讨论】:
-
一个典型的设置是使用
logs[AN_ENUM] << a << b << c;,其中第一个<<返回一个包含字符串流的对象,该对象采用<<,其析构函数完成所有工作。但是,使用 Howard 建议的函数调用语法的一个优点是,您可以实现日志级别,然后如果此消息低于当前级别,则不会在运行时浪费时间。 -
@M.M 日志级别?而且我想不出析构函数会做什么。如果您愿意,最好同时拥有这两种解决方案。
-
“日志级别”意味着您可以为日志消息分配不同的优先级,然后在运行时(例如响应配置文件)决定显示或不显示什么。例如,您可能会记录对调试有用的信息,但您通常不想记录这些信息,除非有人遇到问题并决定打开它。
-
@MM 啊。而使用#ifdef 当然只是编译时的。说得通。虽然,流确实接受参数,例如
std::fixed通过<<运算符? -
是的。顺便说一句,这是使用我建议的设置的另一个原因;你现在拥有它的方式,标志将是“粘性的”,例如您的
fixed将一直存在直到它被取消设置,这可能会与其他日志消息混淆