C++ 中的枚举存在一个主要问题:不能在两个不同的枚举中使用一个名称,如下所示:
enum Browser
{
None = 0,
Chrome = 1,
Firefox = 2
}
enum OS
{
None = 0,
XP = 1,
Windows7 = 2
}
那么在这个例子中处理这个问题的最佳方法是什么?
在 C++03 中,您可以将其包含enum
在 a 中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
中也可以进行包装,但我个人认为 wrapping struct
/class
更好,因为namespace
更广泛。例如
// file1.h
namespace X
{
enum E { OK };
}
// file2.h
namespace X
{
enum D { OK };
}
将它们包装在命名空间或类中:
namespace Browser {
enum BrowserType
{
None = 0,
Chrome = 1,
Firefox = 2
}
}
namespace OS {
enum OSType {
None = 0,
XP = 1,
Windows7 = 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
}
如何使用作用域与非作用域枚举?c++11 现在提供范围枚举。一个例子是:
enum class Browser : <type> {
};
enum class OS : <type> {
};
通过浏览器对象或操作系统对象访问枚举类型。