use*_*449 8 c++ boolean lazy-evaluation operator-keyword
我正在尝试实现自己的布尔类,但不能复制&&的本机语义.以下设计的代码演示了这个问题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
编译和运行时,结果是:
Native &&
First
Overloaded &&
Second
First
换句话说,&& on bools是懒惰的(正如任何C++程序员所期望的那样)但是重载的&&不是(正如这个C++程序员至少没想到的那样).
有没有办法让重载&&懒惰?我可以找到各种全面的延迟评估方案来提供类似Haskell的功能,但它们看起来像我的用例完全矫枉过正.
jua*_*nza 15
你不应该超载 bool operator&&,因为你已经发现了短路评估.
正确的方法是为您的班级提供一个bool转换运算符
class MyBool {
public:
bool theValue;
MyBool() {}
MyBool(bool aBool) : theValue(aBool) {}
explicit operator bool() { return theValue; }
};
Run Code Online (Sandbox Code Playgroud)
请注意,显式转换运算符需要符合C++ 11标准.如果你没有这个,请看看安全的bool成语.
| 归档时间: |
|
| 查看次数: |
3001 次 |
| 最近记录: |