如何在C++中将整数转换为枚举类型?
例如:
enum Test
{
A, B
};
int a = 1;
我如何将a
转换为类型Test::A
?
int i = 1;
Test val = static_cast<Test>(i);
auto
,我会得到什么?是否有性能提升? - Frederico Pantuzzaauto myptr = std::make_shared<my::cool::type::class>(1, 2, 3, 4, 5);
比指定 myptr
的完整类型要短得多,而赋值语句的右侧清楚地说明了类型。 - Will EcclesTest e = static_cast<Test>(1);
你的代码:
enum Test
{
A, B
};
int a = 1;
Test castEnum = static_cast<Test>(a);
static_cast
将是更好的选择。 - Mike Seymourstatic_cast
,但也可能是一个 const_cast
或者更糟糕的是 reinterpret_cast
,甚至是这些转换方式的组合。即使你现在知道它会退化成什么,但是假设你稍后将 a
更改为另一种类型,那么进行强制类型转换的方式也可能发生改变,而你甚至不会得到任何警告。这是你不想要的。 - KillianDSTest::A
”,而不是坚持要求在其中使用强制转换,由于这似乎是一个热门问题,而且没有人提到替代方案,根据C++11标准:
因此,直接使用形式5.2.9 Static cast
... 表达式
e
可以使用形如static_cast<T>(e)
的static_cast
显式转换为类型T
,如果声明T t(e);
对于某些虚构的临时变量t
(8.5)是良好定义的。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换结果相同。
t(e)
也可以工作,并且您可能会更喜欢它的整洁性:auto result = Test(a);
Test result(a);
不起作用,因为它看起来是等价的。它会导致一个错误:“无法使用类型为'int'的lvalue初始化变量类型为'Test'”,而这似乎正是所提供的解决方案所做的。 - Bill HollingsTest result(a);
看起来像是为类型 Test
创建一个名为 result
的变量的构造函数调用,并提供了参数 a
。因为 Test
只是枚举类型,而不是类或结构体,所以你不能像构造函数一样调用它。但是 Test(a)
是一种类型转换,所以它们并不等价 — (Test)a
也可以工作。 - rosshjb顺便提一下,如果C++17中枚举的基础类型是固定的,那么可以直接写
enum Test : int {A, B};
int a = 1;
Test val{a};
当然,Test val{1};
也是有效的。
相关的cppreference部分如下(重点在于“underlying type fixed”):
如果以下所有条件都成立,则可以使用列表初始化从整数初始化枚举类型而无需强制转换:
- 初始化为直接列表初始化
- 初始化器列表只有一个元素
- 枚举类型是作用域或非作用域的底层类型固定
- 转换不是收窄的
Test castEnum = static_cast<Test>(a-1);
将把a
转换成A
。如果您不想减去1,可以重新定义enum
:
enum Test
{
A:1, B
};
Test castEnum = static_cast<Test>(a);
将a
转换为A
。
int a
转换成 Test::A,那么它的值必须为0,因为 Test::A 的隐含值为0,而 Test::B 的隐含值为1。除非特别强调要转换成 Test::A,否则这个事实可能并不重要。 - JohnRDOrazio