15

C++ の列挙型には大きな問題が 1 つあります。次のように、1 つの名前を 2 つの異なる列挙型に含めることはできません。

enum Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
}

enum OS
{
    None = 0,
    XP = 1,
    Windows7 = 2
}

では、この例でこの問題を処理する最善の方法は何でしょうか?

4

5 に答える 5

31

enumC++03 では、次のように囲むことができますstruct

struct Browser
{
  enum eBrowser
  {
    None = 0,
    Chrome = 1,
    Firefox = 2
  };
};

C++11 では、次のようにしますenum class

enum class Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
};

C++03namespaceでもラップできますが、個人的にはラッピングの方が広いのでより良いと思いstructます。例えばclassnamespace

// file1.h
namespace X
{
  enum E { OK };
}

// file2.h
namespace X
{
  enum D { OK };
}
于 2012-06-03T11:11:16.693 に答える
13

1 つのオプションは、各列挙型を異なる名前空間に配置することです。

namespace Foo {
  enum Browser {
      None = 0,
      Chrome = 1,
      Firefox = 2
  }
}

namespace Bar {
  enum OS {
      None = 0,
      XP = 1,
      Windows7 = 2
  }
}

コンパイラで利用可能な場合は、C++11列挙型クラスを使用することをお勧めします。

enum class Browser { ... }
enum class OS { ... }

enum クラスの説明については、こちらを参照してください。

于 2012-06-03T11:12:14.807 に答える
3

それらを名前空間またはクラスでラップします。

namespace Browser {
  enum BrowserType
  {
    None = 0,
    Chrome = 1,
    Firefox = 2
  }
}

namespace OS {
   enum OSType  {
      None = 0,
      XP = 1,
      Windows7 = 2
  }
}
于 2012-06-03T11:10:57.250 に答える
1

スコープ付き列挙とスコープなし列挙の使用はどうですか? c++11 はスコープ付き列挙を提供するようになりました。例は次のとおりです。

enum class Browser : <type> {

};

enum class OS : <type> {

};

ブラウザのオブジェクトまたは OS のオブジェクトを介して列挙型にアクセスします。

于 2013-01-28T01:15:47.387 に答える