如何铸造int到enum在c++ ?

在c++中如何将int类型转换为enum类型?

例如:

enum Test
{
A, B
};


int a = 1;

如何将a转换为类型Test::A?

364709 次浏览
int i = 1;
Test val = static_cast<Test>(i);
Test e = static_cast<Test>(1);

你的代码

enum Test
{
A, B
}


int a = 1;

解决方案

Test castEnum = static_cast<Test>(a);

引出最后一个问题,“如何将a转换为__abc0类型”;而不是严格要求在那里有,并回答几年后,只是因为这似乎是一个流行的问题,没有人提到的替代方案,根据c++ 11标准:

5.2.9静态铸造

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

因此,直接使用t(e)形式也可以,你可能更喜欢它的简洁:

auto result = Test(a);

Test castEnum = static_cast<Test>(a-1);将把a转换为A。如果你不想要子结构1,你可以重新定义enum:

enum Test
{
A:1, B
};

在这种情况下,Test castEnum = static_cast<Test>(a);可以用来强制转换aA

只是提一下,如果enum的底层类型恰好是固定的,从c++ 17开始,可以简单地编写

enum Test : int {A, B};
int a = 1;
Test val{a};

当然,Test val{1};也是有效的。

相关的cppreference部分如下(重点是我的):

如果以下所有条件都为真,则可以使用列表初始化从没有强制转换的整数初始化枚举:

  • 初始化是直接列表初始化
  • 初始化列表只有一个元素
  • 枚举是scoped或unscoped 底层类型固定
  • 转换是非窄化的