2014-09-11 189 views
0

我读过你不应该相信在被签名或未签名的情况下枚举的底层实现。从这我得出结论,你应该总是把枚​​举值转换成它所比较的​​类型。像这样:将枚举与整数进行比较

enum MyEnum { MY_ENUM_VALUE = 0 }; 

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

unsigned int u = 2; 
if (u > static_cast<unsigned int>(MY_ENUM_VALUE)) 
{ 
    // do more stuff 
} 

这是最佳做法吗?

编辑:如果枚举是匿名的,情况会改变吗?

回答

0

简短的回答:

enumsigned int型,但他们得到隐式转换成unsigned int。你的编译器可能会给出一个警告而没有明确的转换,但它仍然是非常常用的。不过,你应该明确地施展才能让维护者清楚。当然,explicit cast will be must when its a strongly typed enum

+0

“枚举符号int类型,但它们会隐式转换为无符号整型”这是错误的。非范围的'enum'的基础类型是一个整数类型,它可以适合最大的枚举器。这意味着如果它大于'INT_MAX',它可以是'unsigned int','long','unsigned long'等。并且它隐式地转换为最小的整数类型,它可以适合最大的枚举器(它是'总是'unsigned int')。 – Simple 2014-09-11 08:55:30

0

最佳做法是不要写

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

,而不是写

MyEnumValue i = MY_ENUM_VALUE ; 
... 
if (i > MY_ENUM_VALUE) {..} 

但如果 - 在您的例子 - 你只需要在你的枚举一个值最好是其声明为常数而不是枚举。

+0

我同意这种情况主要出现在应该定义为常量的值在枚举中定义时。 – khuttun 2014-09-11 08:45:01

0

enum是一个整数,因此您可以针对任何其他整数进行比较,甚至漂浮。在比较之前,编译器会自动将这两个整数转换为最大值,或将enum转换为double值。

现在,如果你的枚举不应该代表一个号码本身,你可能要考虑创建一个类来代替:

enum class some_name { MY_ENUM_VALUE, ... }; 

int i; 
if(i == static_cast<int>(some_name::MY_ENUM_VALUE)) 
{ 
    ... 
} 

在你需要投这种情况下,因为枚举类不被视觉作为默认的整数。这有助于颇有几分避免的情况下,你是滥用枚举值的错误...