C++ の列挙型には大きな問題が 1 つあります。次のように、1 つの名前を 2 つの異なる列挙型に含めることはできません。
enum Browser
{
None = 0,
Chrome = 1,
Firefox = 2
}
enum OS
{
None = 0,
XP = 1,
Windows7 = 2
}
では、この例でこの問題を処理する最善の方法は何でしょうか?
enum
C++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
ます。例えばclass
namespace
// file1.h
namespace X
{
enum E { OK };
}
// file2.h
namespace X
{
enum D { OK };
}
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 クラスの説明については、こちらを参照してください。
それらを名前空間またはクラスでラップします。
namespace Browser {
enum BrowserType
{
None = 0,
Chrome = 1,
Firefox = 2
}
}
namespace OS {
enum OSType {
None = 0,
XP = 1,
Windows7 = 2
}
}
スコープ付き列挙とスコープなし列挙の使用はどうですか? c++11 はスコープ付き列挙を提供するようになりました。例は次のとおりです。
enum class Browser : <type> {
};
enum class OS : <type> {
};
ブラウザのオブジェクトまたは OS のオブジェクトを介して列挙型にアクセスします。