如何在C ++中将int枚举为枚举?


222

如何在C ++中将整数转换为枚举?

例如:

enum Test
{
    A, B
};

int a = 1;

如何转换a成文字Test::A


1
链接请注意,int是否匹配枚举类型的常量之一并不重要。类型转换始终是非法的。
Iwaz 2014年

3
我相信,如果要转换为Test :: A的值int a必须为0,因为Test :: A的隐式值为0,而Test :: B的隐式值为1。专门针对Test :: A是
不重要的

Answers:


243
int i = 1;
Test val = static_cast<Test>(i);

21
自动val = static_cast <Test>(i); // C ++ 11
Mitch

3
@Mitch auto在这种情况下可以使用什么?是否有任何性能改进?
Frederico Pantuzza'5

2
没有性能改善。如果您使用“ auto”指定,编译器只会自动推断类型。如果您决定将来更改枚举名称,那么您将减少对代码的修改,因为编译器会自动推断出正确的类型名称。
艾登·奥兹坎(AydinÖzcan)

74
Test e = static_cast<Test>(1);

10
MSDN:static_cast运算符可以将整数值显式转换为枚举类型。如果整数类型的值不在枚举值的范围内,则所得的枚举值不确定。
Kirill Kobelev 2012年

1
@KirillKobelev如果整数值可以由枚举的基础类型表示,则结果枚举必须具有该值。否则,产生的枚举值将是将表达式转换为枚举的基础类型所产生的任何值。如果VC ++做一些不同的事情,那么我认为它是不合格的。
bames53

2
如果enum的值为{1,3,5},并且代码尝试从值2开始<static_cast>,那么合格的编译器应怎么做?与C-cast有何不同?
Kirill Kobelev 2012年

6
@KirillKobelev我不使用static_cast,因为它与C样式强制转换有所不同,我使用static_cast,因为C ++强制转换在样式上优于C强制转换。
bames53

4
@KirillKobelev“ 如果枚举具有值{1,3,5} ”否。枚举类型不能仅限于这3个可能的值:{1,3,5}是 枚举数(命名为枚举值),而不是枚举本身。如果1,3,5-是可能的枚举值,则这样是2
curiousguy

25

您的密码

enum Test
{
    A, B
}

int a = 1;

Test castEnum = static_cast<Test>(a);

45
最好使用限制最大的强制转换,并完全避免使用C样式强制转换,以使编译器有最好的机会检测错误。static_cast在这里会更好。
Mike Seymour

4
@Mike Seymour,问题在于在这种情况下静态转换与C-cast没有区别。它可以如何检测到什么错误?
Kirill Kobelev 2012年

7
@KirillKobelev:问题是C样式的转换不明确。它可以等于a static_cast,但也可以等于a const_cast或什至更糟,reinterpret_cast或者甚至是它们的组合。即使您现在知道它会降级什么,假设以后再更改a为另一种类型,也很可能是强制转换的类型,而您却没有得到警告的全部,您也不希望这样。
KillianDS

4
@KillianDS“ 假设您稍后将a更改为另一种类型?
curiousguy 2012年

2
是的,如果有的话,或者隐式转换。演员表的意图要清楚得多。
KillianDS

8

分拆收盘问题,“我怎么转换为类型Test::A”,而不是死板的要求有一个在里面,并回答了几年后期只是这似乎成为一种流行的问题,其他人似乎已经提到的替代,按照C ++ 11标准:

5.2.9静态转换

... 对于某些发明的临时变量(8.5),如果声明格式正确,则 e可以T 使用static_cast形式的a 将表达式显式转换为类型。这种显式转换的效果与执行声明和初始化,然后将临时变量用作转换结果的效果相同。static_cast<T>(e)T t(e);t

因此,直接使用表单t(e)也可以,并且您可能更喜欢它的简洁性:

auto result = Test(a);

如果编译器选项阻止static_cast <>(语义检查),则此解决方案有效。这对我来说并不合理,但仍然很整洁。
布森先生

1

Test castEnum = static_cast<Test>(a-1);会将A强制转换为A。如果您不希望使用子结构1,则可以重新定义enum

enum Test
{
    A:1, B
};

在这种情况下,“测试castEnum = static_cast(a);” 可用于将A强制转换为A。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.