在c++中如何将int类型转换为enum类型?
例如:
enum Test { A, B }; int a = 1;
如何将a转换为类型Test::A?
a
Test::A
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)。 这种显式转换的效果与执行相同 声明和初始化,然后使用临时 变量作为转换的结果
5.2.9静态铸造
e
T
static_cast<T>(e)
static_cast
T t(e);
t
因此,直接使用t(e)形式也可以,你可能更喜欢它的简洁:
t(e)
auto result = Test(a);
Test castEnum = static_cast<Test>(a-1);将把a转换为A。如果你不想要子结构1,你可以重新定义enum:
Test castEnum = static_cast<Test>(a-1);
A
enum
enum Test { A:1, B };
在这种情况下,Test castEnum = static_cast<Test>(a);可以用来强制转换a到A。
只是提一下,如果enum的底层类型恰好是固定的,从c++ 17开始,可以简单地编写
enum Test : int {A, B}; int a = 1; Test val{a};
当然,Test val{1};也是有效的。
Test val{1};
相关的cppreference部分如下(重点是我的):
如果以下所有条件都为真,则可以使用列表初始化从没有强制转换的整数初始化枚举: 初始化是直接列表初始化 初始化列表只有一个元素 枚举是scoped或unscoped 底层类型固定 转换是非窄化的
如果以下所有条件都为真,则可以使用列表初始化从没有强制转换的整数初始化枚举: