C ++中的枚举有一个主要问题:你不能在两个不同的枚举中有一个名字:
enum Browser
{
None = 0,
Chrome = 1,
Firefox = 2
}
enum OS
{
None = 0,
XP = 1,
Windows7 = 2
}
那么在这个例子中处理这个问题的最佳方法是什么?
答案 0 :(得分:29)
在C ++ 03中,您可以将enum
括在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 ++ 03中namespace
也可以被包装,但我个人觉得包裹struct
/ class
更好,因为namespace
更广泛。 e.g。
// file1.h
namespace X
{
enum E { OK };
}
// file2.h
namespace X
{
enum D { OK };
}
答案 1 :(得分:12)
一种选择是将每个枚举放在不同的命名空间中:
namespace Foo {
enum Browser {
None = 0,
Chrome = 1,
Firefox = 2
}
}
namespace Bar {
enum OS {
None = 0,
XP = 1,
Windows7 = 2
}
}
如果编译器可以使用,更好的选择是使用C ++ 11 enum classes:
enum class Browser { ... }
enum class OS { ... }
有关枚举类的讨论,请参阅here。
答案 2 :(得分:3)
将它们包装在名称空间或类中:
namespace Browser {
enum BrowserType
{
None = 0,
Chrome = 1,
Firefox = 2
}
}
namespace OS {
enum OSType {
None = 0,
XP = 1,
Windows7 = 2
}
}
答案 3 :(得分:2)
您可以使用C ++ 11中支持的enum class
(scoped enums)。它是强类型的,表示每种enum
类型都不同。
Browser::None != OS::None
enum class Browser
{
None = 0,
Chrome = 1,
Firefox = 2
}
enum class OS
{
None = 0,
XP = 1,
Windows7 = 2
}
答案 4 :(得分:1)
如何使用范围与未范围的枚举? c ++ 11现在提供范围枚举。一个例子是:
enum class Browser : <type> {
};
enum class OS : <type> {
};
通过浏览器的对象或OS的对象访问枚举类型。