假设我们有多个日志记录级别:跟踪,调试,信息,错误。
我想知道是否可以编写以下代码:

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());

如果level小于global_severity_level,则不会调用create_message。实际上,无论创建字符串如何,create_message都可能很长。如果有很多“调试”日志,则在非 Debug模式下运行时,这些日志可能会成为相当大的开销。

我知道如果函数“log”是宏,则可以这样做,仅当严重性> minimum_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/

10-11 03:55