新的 C++ 标准使使用一种新的枚举类型成为可能,对我个人而言,它比旧的常规enum
“枚举”方便得多,但有一个问题 - 对我个人来说不是很方便,这里是一个例子以及问题的本质:
enum class Colors: DWORD
{
RED = 0xFFFF0000,
GREEN = 0xFF00FF00
...
}
我开始使用:
void draw2DBox(DWORD col)
{
...//Не важно что здесь
}
int main()
{
draw2DBox(Colors::RED )//Компилятор считает Colors::RED как какой-то объект а не член типа DWORD
return 0;
}
你必须做一个类型转换:
int main()
{
draw2DBox((DWORD)Colors::RED )//Так компилируется - но это жутко не удобно
return 0;
}
也许你可以不用类型转换来做?
更新:
我正在使用 VS 2015
不起作用,不应该起作用,也不会起作用。
引入的想法
enum class
是隔离它的值和一个特殊类型的可见性。隐式转换在设计上不可用:http://ideone.com/QQkRvZ
禁止隐式类型转换是
class
在枚举定义中使用关键字的结果之一。这个关键字的作用是双重的:首先,它声明了一个作用域枚举(与“常规”无作用域枚举相反);其次,它禁止隐式转换为整数类型。同时,在 C++ 中,您可以将枚举“基于”您选择的整数类型,而无需指定关键字
class
这是一个枚举类型,可以完全按照您的需要隐式地自由转换为整数类型。
但是,通过删除单词
class
,您以及对强制转换的限制也会使您的枚举无作用域,即 现在枚举内部的常量将在全局命名空间中可见,如RED
等GREEN
。那些。无需使用Colors::RED
,Colors::GREEN
。这不是很令人愉快,但是由您来判断此选项是否适合您。(但是,如果你愿意,你可以继续使用限定名称 - 等来引用这些标识符
Colors::RED
。Colors::GREEN
这个特性出现在 C++11 中,一般适用于所有枚举类型。但实际上,这只不过是语法糖:for所有枚举 - 对于没有关键字声明的类型class
,常量名称会溢出到封闭的命名空间中。)如果您仍然真的想使用隐式转换,但同时获得作用域枚举的完整模拟,则可以使用来自的包装器“模拟”所需的行为
struct
能。但是要做到这一点,您要么必须将被调用函数的签名从
在
或者加上相应的重载,里面会做必要的改造: