如何在 C++ 中将 int 转换为枚举?
例如:
enum Test
{
A, B
};
int a = 1;
如何将
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 转换为类型
Test::A
”,而不是严格要求其中有 cast,并且晚了几年才回答,因为这似乎是一个流行的问题,并且根据 C++11 标准,没有其他人提到过替代方案:
5.2.9 静态投射
...表达式
可以显式转换为类型e
使用T
形式的static_cast
如果声明 对于某些发明的临时变量static_cast<T>(e)
(8.5),T t(e);
格式良好。 这种显式转换的效果与执行 声明和初始化,然后使用临时 变量作为转换的结果。t
因此直接使用表格
t(e)
也可以,而且你可能更喜欢它的整洁性:
auto result = Test(a);
顺便提一下,如果
enum
的底层类型恰好是固定的,从C++17开始,可以简单地写成
enum Test : int {A, B};
int a = 1;
Test val{a};
当然,
Test val{1};
也是有效的。
相关的 cppreference 部分如下(强调我的):
如果满足以下所有条件,则可以使用列表初始化从整数初始化枚举,无需强制转换:
- 初始化是直接列表初始化
- 初始化列表只有一个元素
- 枚举要么有作用域,要么无作用域 基础类型固定
- 转换是非窄化的
Test castEnum = static_cast<Test>(a-1);
会将 a
投射到 A
。如果你不想对 1 进行substruct,你可以重新定义 enum
:
enum Test
{
A:1, B
};
在这种情况下,
Test castEnum = static_cast<Test>(a);
可用于将a
投射到A
。