これはダブルバントリックの例である可能性があります。詳細については、The Safe Bool Idiomを参照してください。ここでは、記事の最初のページを要約します。
C ++では、クラスにブールテストを提供する方法がいくつかあります。
明白な方法はoperator bool
変換演算子です。
// operator bool version
class Testable {
bool ok_;
public:
explicit Testable(bool b=true):ok_(b) {}
operator bool() const { // use bool conversion operator
return ok_;
}
};
クラスをテストできます
Testable test;
if (test)
std::cout << "Yes, test is working!\n";
else
std::cout << "No, test is not working!\n";
ただし、やopereator bool
などの無意味な操作が許可されるため、安全ではないと見なされています。test << 1;
int i=test
operator!
暗黙的な変換やオーバーロードの問題を回避できるため、使用する方が安全です。
実装は簡単です。
bool operator!() const { // use operator!
return !ok_;
}
Testable
オブジェクトをテストする2つの慣用的な方法は次のとおりです。
Testable test;
if (!!test)
std::cout << "Yes, test is working!\n";
if (!test2) {
std::cout << "No, test2 is not working!\n";
最初のバージョンif (!!test)
は、一部の人々がダブルバントリックと呼ぶものです。