Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 短路`操作员<<;`以C++;_C++ - Fatal编程技术网

C++ 短路`操作员<<;`以C++;

C++ 短路`操作员<<;`以C++;,c++,C++,我有一些代码,上面点缀着这样的结构 if(debug) { Output << "f1: " << f1() << "\n"; } Debug << "f1: " << f1() << "\n"; 如果设置了某个全局标志,则会生成输出,否则不会 现在:让Debug返回一个流向/dev/null的流,这将吞掉输出,这非常容易做到。问题是,f1()仍然会被计算(并“呈现”成可能更昂贵的文本表示),这可能对性能非常不利

我有一些代码,上面点缀着这样的结构

if(debug) {
    Output << "f1: " << f1() << "\n";
}
Debug << "f1: " << f1() << "\n";
如果设置了某个全局标志,则会生成输出,否则不会

现在:让
Debug
返回一个流向
/dev/null
的流,这将吞掉输出,这非常容易做到。问题是,
f1()
仍然会被计算(并“呈现”成可能更昂贵的文本表示),这可能对性能非常不利

现在我的问题是:是否有任何技巧允许跳过

"f1: " << f1() << "\n"

“f1:如果您不反对宏,并且愿意接受语法:

Debug( "f1: " << f() << '\n' );

Debug(“f1:您可以定义此宏:

#define Debug_Stream \
if(!debug); else Output
这将使:

Debug_Stream << "f1: " << f1() << "\n";

Debug\u Stream我认为您可以通过创建一个延迟求值器来实现这一点,该延迟求值器封装了昂贵的函数调用。您的流将知道它需要调用引用函数的延迟求值器类型,但否则它将不操作它,从而阻止昂贵的调用。无调试流知道代理求值器对象只需跳过全面评估

例如,一个呼叫可能看起来像:

Debug << "123" << delay(f()) << "456" << std::endl;

今天早些时候的
Debug可能有解决方案。@juanchopanza:这些问题仍然(可能)评估参数。我认为这不能按要求完成,除非您将格式切换为类似
DEBUGOUT(“f1:@MooingDuck true。它们只会避免流式传输。这看起来很相似:@MooingDuck:除了使用的那个。这将很容易出现其他不匹配的情况。@MarkB:可以通过定义
if(!debug);else输出来修复。很好。谢谢@ybungalobill的建议。我已将答案更改为修复。
if(debug) {
    Output << "f1: " << f1() << "\n";
}
if(!debug);
else
    Output << "f1: " << f1() << "\n";
Debug << "123" << delay(f()) << "456" << std::endl;