使用强类型枚举切换语句

mar*_*ark 26 c++ enums c++11

在switch语句中使用强类型枚举时有没有办法避免显式转换int

/// @desc an enumeration of the states that the session can be in.
enum class State
{
    Created,    
    Connected,  
    Active,
    Closed
};

State sesState = session->GetState();

switch (static_cast<int>(sesState))
{
    case static_cast<int>(Session::State::Created):
    // do stuff.
    break;

    case static_cast<int>(Session::State::Connected):
    // do stuff.
    break;
}
Run Code Online (Sandbox Code Playgroud)

从n3242草案:

6.4.2 switch语句[stmt.switch]

2条件应为整数类型,枚举类型或类型,其中存在单个非显式转换函数为积分或枚举类型(12.3).

枚举类型是否包含强类型枚举,或者它们是否与switch语句不兼容,因为它们需要显式转换为int

Som*_*ude 39

枚举类型仍然是枚举类型,即使是否是强类型,并且在switch语句中始终工作正常.

例如,请参阅此程序:

#include <iostream>

enum class E
{
    A,
    B
};

int main()
{
    E e = E::A;

    switch (e)
    {
    case E::A:
        std::cout << "A\n";
        break;
    case E::B:
        std::cout << "B\n";
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个输出是"A".

  • 当你说`switch(e)`它应该已经知道使用enum成员而没有臃肿的语法.抱歉咆哮:p (3认同)
  • 有没有办法只说“case A”等,也许带有“using”声明? (2认同)
  • 所以你需要为每个枚举成员使用 :( (2认同)
  • 我想我可以在名称空间中放置一个普通的枚举,但是随后我失去了没有隐式强制转换的安全性……我只是想为开关提供更好的语法! (2认同)
  • @jiggunjer,从 C++20 开始,您想要的就存在,作为 [`using enum` 声明](https://en.cppreference.com/w/cpp/language/enum#Using-enum-declaration)。 (2认同)