我有一些代码,像这样的构造
if(debug) {
Output << "f1: " << f1() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是编写一个流类Debug,我可以像这样编写它
Debug << "f1: " << f1() << "\n";
Run Code Online (Sandbox Code Playgroud)
如果设置了某个全局标志,那么这将生成输出,否则不会.
现在:通过Debug返回一个/dev/null吞噬输出的流可以很容易地做到这一点.问题是f1()仍然会被评估(并"渲染"成文本表示,这可能会更加昂贵),这可能对性能非常不利.
现在我的问题是:是否有任何技巧可以跳过"评估"
"f1: " << f1() << "\n"
Run Code Online (Sandbox Code Playgroud)
完全如果Debug决定不应该输出?到短路是C++做类似的f() && g()地方g(),如果不计算f()为false(我认真考虑编写一个使用流类&&作为输出操作,但是从我读短路没有重载完成operator&&)
你可以做的是定义这个宏:
#define Debug_Stream \
if(!debug); else Output
Run Code Online (Sandbox Code Playgroud)
这会使这个:
Debug_Stream << "f1: " << f1() << "\n";
Run Code Online (Sandbox Code Playgroud)
变得等同于:
if(debug) {
Output << "f1: " << f1() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
但字面上(加上空白以便于阅读)
if(!debug);
else
Output << "f1: " << f1() << "\n";
Run Code Online (Sandbox Code Playgroud)