はそれはとてもそのif()
の動作を変更することは可能ですか?または...C++「オーバーロード」であれば()文
intへの明示的なユーザー定義型の変換は適切な方法ですか?または...
if(foo.getX())
のような処理を行うのが最適ですか?
はそれはとてもそのif()
の動作を変更することは可能ですか?または...C++「オーバーロード」であれば()文
intへの明示的なユーザー定義型の変換は適切な方法ですか?または...
if(foo.getX())
のような処理を行うのが最適ですか?
あなたはoperator bool()
を定義することにより、ブール値にあなたのオブジェクトを変換することができます
explicit operator bool() const
{
return foo.getX();
}
explicit
キーワードがbool
にFoo
から暗黙的な変換を防ぐことができます。たとえば、foo
をfoo + 1
のような算術式に入れた場合、operator bool()
をexplicit
と宣言すると、コンパイラはこのエラーを検出する可能性があります。そうでない場合は、bool
に変換されます。一般に
、(任意explicit
とconst
修飾子)フォーム
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
と宣言できます。
明示的にする方が良いでしょう。 – chris
**あなたが '!myClass'のようなことを許可したいのでない限り、これは明示的に**印をつけたいと思います。 – templatetypedef
あなたは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
あなたがC++ 03のコンテキストでこれを必要とする場合、あなたは安全なブールイディオムに見たいと思うかもしれません:http://www.artima.com/cppsource/safebool .html – Yuushi