2012-07-12 119 views
129

可能重复:
Generic way to cast int to enum in C++如何将int转换为C++中的枚举?

如何我投一个int在C++枚举?

例如:

enum Test 
{ 
    A, B 
}; 

int a = 1; 

如何转换a的型式试验::阿?

+84

我喜欢这个做一个谷歌搜索时,有负分,标记为复制,但结果的最前面的事实“C++ int enum” – Rickard 2013-11-18 14:29:28

+1

[link](http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/) 注意int是否与枚举类型的常量之一匹配并不重要;类型转换总是非法的。 – Iwaz 2014-03-29 11:39:55

+6

如果这是一个重复,那么为什么答案如此不同? – nobar 2015-02-10 22:54:39

回答

152
int i = 1; 
Test val = static_cast<Test>(i); 
+11

auto val = static_cast (i); // C++ 11 – Mitch 2016-09-30 17:58:37

+1

@Mitch我在这种情况下使用'auto'会得到什么?有没有任何性能改进? – 2017-05-19 03:29:31

+1

没有性能改进。仅维护改进。 – Mitch 2017-06-12 15:26:42

50
Test e = static_cast<Test>(1); 
+0

MSDN:没有运行时类型检查有助于确保转换的安全性(http://msdn.microsoft.com/zh-cn/library/c36yw7x9(v=vs.80).aspx)。 – 2012-07-12 13:43:36

+6

MSDN:static_cast运算符可以显式地将整数值转换为枚举类型。如果整型值不在枚举值范围内,则结果枚举值是未定义的。 – 2012-07-12 13:56:15

+1

@KirillKobelev如果积分值可以由枚举的基础类型表示,那么生成的枚举必须具有该值。否则,生成的枚举值将是将表达式转换为枚举的基础类型所得到的值。如果VC++做了一些不同的事情,我认为这是不符合要求的。 – bames53 2012-07-12 17:09:12

13

您的代码

enum Test 
{ 
    A, B 
} 

int a = 1; 

解决方案

Test castEnum = (Test)a; 
+34

这是一个不错的主意,你可以使用最严格的强制转换,并避免使用C风格强制转换,从而为编译器提供检测错误的最佳机会。'static_cast'在这里会更好。 – 2012-07-12 13:57:37

+3

@Mike Seymour,问题在于在这种情况下静态转换与C-cast没有区别。如何和它可以检测到什么错误? – 2012-07-13 00:19:00

+7

@KirillKobelev:问题是C风格的演员阵容不明确。它可以等同于'static_cast',但它也可以是'const_cast',甚至更糟糕,'reinterpret_cast'甚至是这些的组合。即使你现在知道它会降级什么,假设你稍后将'a'改为另一种类型,它可能是更改类型的转换,而不会像警告那样多,你不需要这样做。 – KillianDS 2012-07-13 07:01:22