gpt4 book ai didi

c++ - C++ 中的惰性日志记录

转载 作者:可可西里 更新时间:2023-11-01 17:35:30 25 4
gpt4 key购买 nike

假设我们有几个级别的日志记录:trace、debug、info、error。我想知道是否有一种方法可以编写以下代码:

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,则不调用 create_message。事实上,create_message 可以很长,而且不管它创建什么字符串。如果有很多“调试”日志,那么在非 Debug模式下运行时,这些日志可能会成为巨大的开销。

我知道如果函数“log”是一个宏,则可以这样做,仅当 severity > minimal_severity 时才调用 create_message();但是没有宏就没有另一种方法吗?

编辑

在上面,我没有指定 create_message,因为它可以是任何东西,特别是:

log(level, "Created object " + my_object.getName());

在这种情况下,有没有办法以一种对调用日志的程序员相对透明的方式来编写日志,而不创建完整的字符串?

非常感谢

最佳答案

类似于@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;
}
}

关于c++ - C++ 中的惰性日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com