Sav*_*inG 8 c++ logging iostream lazy-evaluation
我正在寻找一种可移植的方法来实现C++中用于记录类的延迟评估.假设我有一个简单的日志记录功能
void syslog(int priority, const char *format, ...);
Run Code Online (Sandbox Code Playgroud)
然后在syslog()函数中我们可以做到:
if (priority < current_priority)
return;
Run Code Online (Sandbox Code Playgroud)
所以我们从来没有实际调用格式化函数(sprintf).另一方面,如果我们使用像日志流一样
log << LOG_NOTICE << "test " << 123;
Run Code Online (Sandbox Code Playgroud)
所有的格式化总是被执行,这可能需要很长时间.是否有可能实际使用ostream的所有好东西(如类的自定义<<运算符,类型安全,优雅语法......),以便在检查日志记录级别后执行格式化?
这看起来可以用表达式模板来处理。但请注意,表达式模板的实现起来绝对不简单。
它们工作的总体思路是,操作符只是构建一个临时对象,然后将该临时对象传递给日志记录对象。日志记录对象将查看日志记录级别并决定是否执行临时对象中包含的操作,或者只是丢弃它。