用C++短路`operator <<`输出

bgs*_*aid 4 c++

我有一些代码,像这样的构造

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&&)

Eri*_*inn 5

你可以做的是定义这个宏:

#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)

  • 这将容易悬挂其他不匹配. (2认同)