如何在用户定义的函数中实现短路评估?

时间:2012-02-24 00:54:28

标签: c++ short-circuiting

&&||等运算符执行短路评估。此外,当使用参数调用函数时,所有参数都在调用函数之前构造。

例如,采取以下三个功能

bool f1();
bool f2();
bool f3(bool, bool);

如果我打电话

if( f3(f2(),f1()) )//Do something

然后在调用f2之前评估f1f3的返回值。 ,如果我使用(常规)operator||代替f3,则上述代码将等同于

if( f2()||f1() )//Do something
如果f1评估为真,则不会评估

f2

我的问题是:是否有可能让f3(用户定义的函数采用两个布尔值)的行为方式相同?如果不是,是什么让operator||如此特别?

3 个答案:

答案 0 :(得分:2)

如果f3()取得函数结果的值,则不行。

但如果它需要函数的地址(或者更通常将其输入视为函子)而不是结果,那么f3()可以决定是否需要调用函数。

template<typename F1, typename F2>
bool f3(F1 const& f1, F2 const& f2)
{
    return f1() || f2();
}

bool f1();
bool f2();

int main()
{
    f3(&f1, &f2);
}

答案 1 :(得分:0)

你的前提是不正确的。重载operator||operator&&始终评估两者他们的参数;没有短路。

参见More Effective C++的第7项,以便对此进行讨论。

答案 2 :(得分:0)

你无法比较||操作员和类似的功能。 ||是逻辑运算符,它检查给定的值,如果左操作数被评估为false,则不需要检查正确的值。

对于函数,f1()或f2()返回的任何值对f3()都有效。无法为函数参数启用“逻辑操作数”功能,即使它们采用bool参数也是如此。