2

同じ値を持つ 2 つの異なる列挙型を作成することは可能ですか? 例えば、

enum direction{
    LEFT,
    RIGHT,
    UP,
    DOWN,
    NONE
}
enum color{
   RED,
   GREEN,
   BLUE,
   NONE
}

コンパイラは、「NONE」の宣言が 2 つあると言うでしょう。これを回避する方法はありますか?

4

1 に答える 1

11

これにはいくつかの方法があります。1 つの方法は、名前空間を使用して列挙型をラップし、値がグローバル名前空間を汚染するのを防ぐことです。

namespace direction {
    enum direction {
        LEFT,
        RIGHT,
        UP,
        DOWN,
        NONE
    };
}
namespace color {
    enum color {
       RED,
       GREEN,
       BLUE,
       NONE
    };
}

新しい C++11 の方法 (コンパイラがサポートしている場合) を使用して、「厳密に型指定された列挙型」を使用することもできます。

enum class direction {
    LEFT,
    RIGHT,
    UP,
    DOWN,
    NONE
};
enum class color {
   RED,
   GREEN,
   BLUE,
   NONE
};

direction::NONEどちらも構文orで使用できますが、color::NONE大きな違いが 1 つあります。最初のケースでは、列挙型は暗黙のうちに int にキャストされます。これは、あなたが書くことができることを意味します

int foo = direction::NONE;

そしてすべてが順調です。

2 番目のケースでは、foo が direction と同じ型ではないため、これはコンパイラ エラーになります。あなたはこれを回避することができます

direction foo = direction::NONE;

あなたのために働くかもしれないし、働かないかもしれません。int にキャストする必要がある場合はstatic_cast<int>(foo)、整数型を取得するために使用できます。

于 2013-09-25T15:10:18.127 に答える