Tom*_*vin 14
从C++ 11开始,你可以使用enum class(或者enum struct- 同样的,以不同的方式声明),其中枚举值的范围限定为枚举的名称.例如,这是一个有效的C++ 11声明.
enum class token_type {
open_paren,
close_paren,
identifier
};
Run Code Online (Sandbox Code Playgroud)
但是,要访问枚举的值,必须使用::运算符正确地对其进行范围调整.因此,这是C++ 11中的有效赋值:
token_type type = token_type::close_paren;
Run Code Online (Sandbox Code Playgroud)
但这不是:
token_type type = close_paren;
Run Code Online (Sandbox Code Playgroud)
这解决了命名冲突,意味着您不必使用容器命名空间或结构只是为了阻止值泄漏到不应该的位置.这意味着以下枚举可以存在于以下相同的范围内token_type:
enum class other_enum {
block,
thingy,
identifier
};
Run Code Online (Sandbox Code Playgroud)
现在identifier,在两个不同结构中调用的两个值不会干扰.
我使用Michael和Roger所做的变体:
namespace Color
{
enum Type
{
red,
green,
blue
};
};
void paintHouse(Color::Type color) {...}
main()
{
paintHouse(Color::red);
}
Run Code Online (Sandbox Code Playgroud)
我觉得Color::Type比Color::Color或更漂亮,更自我记录COLOR::Color.如果你发现Color::Type太冗长,你可以使用Color::T.
我没有为枚举值添加前缀(即COLOR_RED),因为枚举周围的命名空间实际上成为前缀.
我已经停止对我的作用域常量使用ALL_CAPS约定,因为它们与C库中的宏发生冲突(例如NULL).宏未定义在它们定义的名称空间中.
如果枚举被多个类使用,那么我会说它并不真正属于单个类的定义,而是属于这些类所在的命名空间。
也就是说,除非枚举通过一个类传递到另一个类的构造函数,在这种情况下,单独实例化枚举依赖类并将其作为参数传递给包含类的构造函数可能更有意义。