2013-05-08 6 views
10

はそれはとてもそのif()の動作を変更することは可能ですか?または...C++「オーバーロード」であれば()文

intへの明示的なユーザー定義型の変換は適切な方法ですか?または...

if(foo.getX())のような処理を行うのが最適ですか?

+4

あなたがC++ 03のコンテキストでこれを必要とする場合、あなたは安全なブールイディオムに見たいと思うかもしれません:http://www.artima.com/cppsource/safebool .html – Yuushi

答えて

22

あなたはoperator bool()を定義することにより、ブール値にあなたのオブジェクトを変換することができます

explicit operator bool() const 
{ 
    return foo.getX(); 
} 

explicitキーワードがboolFooから暗黙的な変換を防ぐことができます。たとえば、foofoo + 1のような算術式に入れた場合、operator bool()explicitと宣言すると、コンパイラはこのエラーを検出する可能性があります。そうでない場合は、boolに変換されます。一般に

、(任意explicitconst修飾子)フォーム

operator TypeName() 

のメンバ関数は、変換演算子です。クラスをTypeNameで指定されたタイプにキャストできます。他の方向では、一つの引数を持つコンストラクタは、あなたのクラスに任意の型にキャストすることができます:これはあなたのクラスの暗黙の型変換を定義し

class Foo { 
    Foo(int x); // convert int to Foo 
    operator bool() const; // convert Foo to bool 
    int x; 
}; 

。可能であれば、コンパイラーはこれらの変換を適用しようとします(組み込みデータ型の場合と同じように、たとえば5 + 1.0)。望ましくない暗黙的な変換を抑制するために、それらをexplicitと宣言できます。

+7

明示的にする方が良いでしょう。 – chris

+1

**あなたが '!myClass'のようなことを許可したいのでない限り、これは明示的に**印をつけたいと思います。 – templatetypedef

11

あなたはbool

class Foo 
{ 
    int x; 
public: 
    operator bool() const 
    { 
    return x > 0; 
    } 
}; 

にオブジェクトを変換する演算子を定義することができますしかし、あなたは場所を取るための変換を希望していないとき、これはboolにあるため暗黙的な変換の意図しない結果を持つことができます。例えば

int x = 42 + Foo(); 

C++ 11を使用するだけようifステートメント内など、特定の状況で暗黙的な変換を可能にする、explicitとして変換演算子を宣言できるようにすることで、この問題を解決します。

explicit operator bool() const // allowed in C++11 

int x = 42 + Foo(); // error, no implicit conversion to bool 
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed 
関連する問題