假设我们有几个级别的日志记录:跟踪、调试、信息、错误。我想知道是否有一种方法可以编写以下代码:
enum log_level = {trace, debug, info, error};
log_level global_log_level = info;
void log(log_level level, string& message){
if (level >= global_log_level){
std::cout << message << std::endl;
}
}
string create_message(){
...
}
log_level level = debug;
log (level, create_message());如果级别比global_severity_level小,则不调用global_severity_level。事实上,create_message可能很长,不管它创建什么字符串。如果有大量的“调试”日志,在非调试模式下运行时,这些日志可能会成为大量的开销。
我知道,如果函数"log“是宏,只有在严重性>minimal_severity时才调用create_message(),那么就可以这样做;但是没有宏就没有其他方法可以做到这一点吗?
编辑
在上面,我没有指定create_message,因为它可以是任何东西,特别是:
log(level, "Created object " + my_object.getName());在这种情况下,是否有一种方式来编写日志,这样就不会以相对透明的方式创建完整的字符串,以便程序员调用日志?
非常感谢
发布于 2013-02-02 19:31:55
类似于@sftrabbit,但正如@ipc所建议的那样。
使用模板来避免std::function,编译器可能能够将其内联,因此它最终可能会更快。
template< typename F >
void log(log_level level, F message_creator){
if (level >= global_log_level){
std::cout << message_creator() << std::endl;
}
}https://stackoverflow.com/questions/14665184
复制相似问题