使用强类型枚举的Switch语句

41

在使用强类型枚举(strongly typed enums)进行 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;
}

根据n3242草案:

6.4.2 Switch语句 [stmt.switch]

2 条件必须是整型、枚举类型或者一个类类型,该类型必须存在单个非显式转换函数将其转换为整型或枚举类型 (12.3)。

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


1
http://ideone.com/ZEJcs - 编译时不需要转换。 - Alexey Kukanov
来这里的时候有同样的问题,但事实证明Visual C++ 2015的智能感知在case语句上标记了错误:“此常量表达式具有[...]类型,而不是所需的'int'类型。”尽管有红色波浪线的下划线,但它仍然可以编译。 - snips-n-snails
1个回答

59

枚举类型无论是否强类型化,仍然是枚举类型,并且在 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;
    }
}
这的输出结果是"A"。

2
有没有一种方法可以只说“case A”等等,也许使用一个“using”声明? - jiggunjer
2
所以你需要为每个枚举成员都使用一个 using :( - jiggunjer
3
我可以将一个普通的枚举放入命名空间中,但这样就失去了不会进行隐式转换的安全性...我只是想要更好的用于switch的语法! - jiggunjer
7
当你使用switch(e)时,它应该已经知道如何使用枚举成员而不需要冗长的语法。抱歉发牢骚:p - jiggunjer
2
@jiggunjer,你想要的已经存在了,自C++20起,使用using enum声明就可以了。 - underscore_d
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接