いくつかのオプションがあります。
operator bool
クラスにオーバーロードを実装する必要はありません。
そして、それは一般的に最良の選択ではありません。
最良:名前付き状態チェック。
名前付き状態チェックメソッドを使用するのが最善です。たとえば、iostreamにはfail
メンバーが含まれているため、次のように記述できます。
while( !cin.fail() ) { ... }
自分のクラスの場合、次のようになります。
struct S
{
bool is_good() const { return ...; } // Whatever name.
};
So-so:へのexplicit
変換bool
。
次善の策はexplicit
変換演算子です。これを使用explicit
すると、オブジェクトの1つを関数の引数として渡すために誤って呼び出されるのを防ぐことができます。explicit
変換演算子は引き続き条件で使用されるため、次のように記述できます。
while( cin ) { ... }
これはC++11では
explicit operator bool () const { return !fail(); }
あなた自身のクラスの場合、それは次のようになります
struct S
{
explicit operator bool () const { return ...; }
};
良くない:「プライベート」ポインタ型への暗黙の変換。
第3に、変換をサポートしないコンパイラーexplicit
、つまりC ++ 03コンパイラーを使用していて、説明できない理由で最良の選択である名前付きチェックを望まない場合は、次のような結果タイプを選択できます。不注意による呼び出しの可能性を最小限に抑えます。
void*
C ++ 03では、iostreamsは(toではなく)toへの暗黙的な変換を使用していましたbool
。
一部の人々は、結果がC ++ 03では、クライアントコードにアクセスできない型へのポインタとなる「安全なブールイディオム」を使用することを提唱しています。
絶対に最悪:暗黙の変換bool
。
すべての中で最悪のオプションは次のようなものです
struct S
{
operator bool () { return ... }
};
これとともに
コードを呼び出すことから、どの条件がチェックされているかを知ることはできません。
S
演算子は、関数の引数として渡すために誤って呼び出される可能性があります。
オブジェクトに対して変換を呼び出すことはできませんconst
。
のみを追加するconst
と、少し悪くなります。
それはまだ非常に悪いです。:-)