我想实现自己的布尔类,但是无法复制本地的&&语义。以下编写的代码演示了这个问题:
#include <iostream>>
class MyBool {
public:
bool theValue;
MyBool() {}
MyBool(bool aBool) {theValue = aBool;}
MyBool operator&& (MyBool aBool) {return theValue && aBool.theValue;}
};
bool f1() {std::cout << " First\n"; return false;}
bool f2() {std::cout << " Second\n"; return false;}
int main(int argc, char** argv) {
std::cout << "Native &&\n";
f1() && f2();
std::cout << "Overloaded &&\n";
MyBool(f1()) && MyBool(f2());
return 0;
}
当编译并运行时,结果如下:
Native && First Overloaded && Second First
换句话说,对于布尔值,&&是惰性的(任何C++程序员都会预期),但重载的&&不是(至少这位C++程序员没有预料到)。
有没有办法使重载的&&变成惰性的?我可以找到各种全面的惰性求值方案,以提供类似Haskell的功能,但它们似乎对我的用例来说过于复杂。
&&
运算符的原因。 - Martin YorkMyBool aBool
作为参数传递给它。因此,在实现operator&&
有机会运行之前,需要计算MyBool(f2())
。理论上,您可以编写一个模板operator&&
重载,其RHS是返回MyBool
的函数对象。然后仅在LHS评估为true时调用该函数对象。然后在C++11中,调用者可以编写一个lambda表达式:MyBool(f1()) && []() { return MyBool(f2()); }
。但在实践中,不要这样做——当您必须在每次调用时显式指定它时,惰性求值非常丑陋。 - Steve Jessop