Переключение операторов со строго типизированными перечислениями - PullRequest
26 голосов
/ 30 января 2012

При использовании строго типизированных перечислений в операторе 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 Переключательоператор [stmt.switch]

2 Условие должно быть целого типа, тип перечисления или типа класса, для которого существует одна неявная функция преобразования в целочисленный тип или тип перечисления(12.3).

Включает ли тип перечисления строго типизированные перечисления или они несовместимы с switch операторами, поскольку требуют явного преобразования в int?

1 Ответ

37 голосов
/ 30 января 2012

Тип перечисления по-прежнему является типом перечисления, даже если он строго типизирован или нет, и всегда прекрасно работал в 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;
    }
}

Выход этого «А».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...