独自のブール クラスを実装しようとしていますが、&& のネイティブ セマンティクスを複製できません。次の不自然なコードは、この問題を示しています。
#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;
}
コンパイルして実行すると、結果は次のようになります。
ネイティブ && 初め オーバーロード && 2番 初め
言い換えれば、bools の && は (C++ プログラマーが期待するように) 怠惰ですが、オーバーロードされた && はそうではありません (この C++ プログラマーは少なくとも予期していなかったように)。
オーバーロードされた && を怠惰にする方法はありますか? Haskell のような機能を提供するさまざまな完全な遅延評価スキームを見つけることができますが、私のユースケースでは完全にやり過ぎのように思えます。