如何在 C++ 中将 int 转换为 enum?

问题描述 投票:0回答:6

如何在 C++ 中将 int 转换为枚举?

例如:

enum Test
{
    A, B
};

int a = 1;

如何将

a
转换为类型
Test::A

c++ casting enums
6个回答
336
投票
int i = 1;
Test val = static_cast<Test>(i);

85
投票
Test e = static_cast<Test>(1);

31
投票

您的代码:

enum Test
{
    A, B
};

int a = 1;

解决方案:

Test castEnum = static_cast<Test>(a);

25
投票

剥离最后的问题,“我如何将 a 转换为类型

Test::A
”,而不是严格要求其中有 cast,并且晚了几年才回答,因为这似乎是一个流行的问题,并且根据 C++11 标准,没有其他人提到过替代方案:

5.2.9 静态投射

...表达式

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

因此直接使用表格

t(e)
也可以,而且你可能更喜欢它的整洁性:

auto result = Test(a);

4
投票

顺便提一下,如果

enum
的底层类型恰好是固定的,从C++17开始,可以简单地写成

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

当然,

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

相关的 cppreference 部分如下(强调我的):

如果满足以下所有条件,则可以使用列表初始化从整数初始化枚举,无需强制转换:

  • 初始化是直接列表初始化
  • 初始化列表只有一个元素
  • 枚举要么有作用域,要么无作用域 基础类型固定
  • 转换是非窄化的

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.