3

C では、if/else ステートメントを使用して列挙型の値をテストできます。例えば:

enum Sport {Soccer, Basket};


Sport theSport = Basket;

if(theSport == Soccer)
{
   // Do something knowing that it is Soccer
}
else if(theSport == Basket)
{
   // Do something knowing that it is Basket
}

C++ でこの作業を行う別の方法はありますか?

4

3 に答える 3

8

はい、if-else ステートメントを使用する代わりに、インターフェイスの一部として仮想関数を使用できます。

私はあなたに例を挙げます:

class Sport
{
public:
    virtual void ParseSport() = 0;
};

class Soccer : public Sport
{
public: 
    void ParseSport();
}

class Basket : public Sport
{
public:
    void ParseSport();
}

そして、この方法でオブジェクトを使用した後:

int main ()
{
    Sport *sport_ptr = new Basket();

    // This will invoke the Basket method (based on the object type..)
    sport_ptr->ParseSport();
}

これは、C++ がオブジェクト指向機能を追加したおかげです。

于 2012-05-31T13:30:01.390 に答える
5

あなたはできる

1 コンパイル時にテンプレート マジックを使用して、関連のないさまざまな型に対してさまざまなアクションを実行します。

2実行時に継承とポリモーフィズムを使用して、継承によって関連する型に対してさまざまなアクションを実行します(gliderkiteとrolandXuの回答のように)。

3 (または他の整数型) に対してC スタイルのswitchステートメントを使用します。enum

編集: (非常に単純な) テンプレートを使用した例:

/// class template to be specialised
template<typename> struct __Action;
template<> struct __Action<Soccer> { /// specialisation for Soccer
  static void operator()(const Soccer*);
};
template<> struct __Action<Badminton> { /// specialisation for Badminton
  static void operator()(const Badminton*);
};

/// function template calling class template static member
template<typename Sport> void Action(const Sport*sport)
{
   __Action()(sport);
}
于 2012-05-31T13:35:43.207 に答える
2

あなたはまだCの値をテストしています。つまり、theSportのタイプではなく、列挙値です。C++ は、RTTIと呼ばれる実行時の型チェックをサポートしています。

于 2012-05-31T13:36:36.760 に答える