12

if()の動作を次のように変更することは可能ですか?

class Foo {
    int x;
};

Foo foo;
if(foo)

xの値がゼロ以外の場合にのみ続行しますか? また...

int への明示的なユーザー定義型変換は機能しますか?それは適切なアプローチでしょうか? また...

のようなことをするのが最善if(foo.getX())ですか?

4

2 に答える 2

26

以下を定義することにより、オブジェクトをブール値に変換できますoperator bool()

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

このキーワードは、 からへのexplicit暗黙的な変換を防ぎます。たとえば、誤って のような算術式を入力した場合、として宣言すると、コンパイラはこのエラーを検出できます。Fooboolfoofoo + 1operator bool()explicitfoobool

一般に、次の形式のメンバー関数

operator TypeName()

(オプションexplicitconst修飾子付き) は変換演算子です。で指定された任意の型にクラスをキャストできますTypeName。逆に、1 つの引数を持つコンストラクターを使用すると、任意の型をクラスにキャストできます。

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

これにより、クラスの暗黙的な変換が定義されます。コンパイラは、可能であればこれらの変換を適用しようとします (たとえば、組み込みのデータ型に対して行うことと同様5 + 1.0)。explicit不要な暗黙の変換を抑制するために、それらを宣言することができます。

于 2013-05-08T02:52:37.340 に答える