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

use*_*260 205 c++ enums casting

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

例如:

enum Test
{
    A, B
};

int a = 1;
Run Code Online (Sandbox Code Playgroud)

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

And*_*rew 221

int i = 1;
Test val = static_cast<Test>(i);
Run Code Online (Sandbox Code Playgroud)

  • auto val = static_cast <Test>(i); // C++ 11 (18认同)
  • 没有性能改进。如果您指定“auto”,编译器会自动推断类型。如果您决定将来更改枚举名称,您将减少对代码的修改,因为编译器会自动推导出正确的类型名称。 (8认同)
  • @AydinÖzcan 现代 IDE 可以轻松地重命名整个代码库中的任何内容。 (8认同)
  • 没有性能改进.仅维护改进. (7认同)
  • @Mitch在这种情况下使用`auto`会得到什么?是否有任何性能改进? (2认同)
  • 我想说,比重构方便性更大的改进主要是针对具有长类型签名的东西: `auto myptr = std::make_shared&lt;my::cool::type::class&gt;(1, 2, 3, 4, 5) ;` 比指定 `myptr` 的完整类型要短得多,并且赋值的右侧清楚地表明了类型是什么。 (2认同)

bam*_*s53 71

Test e = static_cast<Test>(1);
Run Code Online (Sandbox Code Playgroud)

  • MSDN:static_cast运算符可以显式地将整数值转换为枚举类型.如果整数类型的值不在枚举值的范围内,则生成的枚举值未定义. (10认同)
  • @KirillKobelev我没有使用static_cast,因为它与C样式转换有什么不同,我使用static_cast,因为C++转换在风格上比C转换更可取. (6认同)
  • @KirillKobelev"_if enum具有值{1,3,5} _"否.**枚举**类型不能仅限于这3个可能的值:{1,3,5}是**枚举器**(命名枚举值),而不是枚举本身.如果1,3,5可能**枚举**值,那么2是. (4认同)
  • @KirillKobelev 如果整数值可以由枚举的基础类型表示,则生成的枚举必须具有该值。否则,生成的枚举值将是将表达式转换为枚举的基础类型所产生的任何值。如果 VC++ 做了一些不同的事情,那么我认为它不符合标准。 (2认同)
  • 一个符合标准的编译器应该做什么,如果枚举有值{1,3,5}并且代码尝试从值2执行<static_cast>.它将如何与C-cast不同? (2认同)

小智 24

你的代码

enum Test
{
    A, B
}

int a = 1;
Run Code Online (Sandbox Code Playgroud)

Test castEnum = static_cast<Test>(a);
Run Code Online (Sandbox Code Playgroud)

  • 使用最严格的强制转换是一个好主意,并且完全避免使用C风格的强制转换,以便为编译器提供检测错误的最佳机会.`static_cast`在这里会更好. (44认同)
  • @KirillKobelev:问题是C风格的演员表不明确.它可以等于`static_cast`,但它也可以是`const_cast`,甚至可以是`reinterpret_cast`,甚至是它们的组合.即使你现在知道它会降级的东西,假设你稍后将'a`改为另一种类型,它很可能就是铸造变化的类型而你不会得到警告,你不希望这样. (7认同)
  • @Mike Seymour,问题在于静态演员在这种情况下与C-cast没有区别.如何以及它可以检测到什么错误??? (4认同)
  • @KillianDS"_假设您稍后将其更改为另一种类型_"哪种类型? (4认同)
  • 是的,无论是那些还是隐式演员(如果可用).演员的意图更加清晰. (2认同)

Tom*_*mmy 11

剥离结束问题,“我如何将 a 转换为类型Test::A”,而不是严格要求在那里有演员表,并且迟到几年才回答,只是因为这似乎是一个受欢迎的问题,而没有其他人提到替代方案, 根据 C++11 标准:

5.2.9 静态转换

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

因此,直接使用表单t(e)也可以,您可能更喜欢它的整洁度:

auto result = Test(a);
Run Code Online (Sandbox Code Playgroud)

  • @BillHollings `Test result(a);` 看起来像是对带有变量 `result` 的类型 `Test` 的构造函数调用,提供了参数 `a`。因为“Test”只是枚举类型,而不是类或结构,所以不能像构造函数一样调用它。但“Test(a)”是类型转换,因此它们并不等效——“(Test)a”也可以。 (4认同)