web-dev-qa-db-ja.com

強く型付けされた列挙を使用したステートメントの切り替え

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条件は、整数型列挙型、または整数型または列挙型への1つの非明示的な変換関数が存在するクラス型(12.3)でなければなりません。

enumeration typeには強く型付けされたenumが含まれていますか、またはswitchへの明示的な変換が必要なため、intステートメントと互換性がありませんか?

27
mark

列挙型は、強く型付けされているかどうかにかかわらず、依然として列挙型であり、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」です。

37