Правильный способ построения строго типизированного перечисления из целого числа - PullRequest
0 голосов
/ 04 июня 2018

Учитывая, что static_cast<MyEnum>(userInt) может привести к неопределенному поведению, если userInt не отображается, каков правильный способ создания строго типизированного перечисления из целого числа, введенного пользователем?

Также я бы хотелхотел бы установить значение по умолчанию, если введенное значение не отображается в перечислении.

Одно из решений:

switch (userInt)
{
    case 1:
        selEnum = myEnum1;
        break;
    case 2:
        selEnum = myEnum2;
        break;
    default:
        selEnum = myEnum2;
        error = true;
        break;
}

Но мне не нравится, что я должен помнитьобновите его, если я изменил значения перечисления.

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете легко проверить, находится ли целое число внутри диапазона базового типа, а затем использовать switch для значений перечисления:

MyEnum convert_from_untrusted_int(int userInt)
{
    using limits = std::numeric_limits<std::underlying_type_t<MyEnum>>>;

    auto const defaultValue = myEnum2;

    if (userInt < limits.min() || userInt > limits.max())
        return defaultValue;

    auto const e = MyEnum(userInt);
    switch (e) {
      case myEnum1:
      case myEnum2:  // compiler will warn if we miss one
        return e;
    }
    // we only get here if no case matched
    return defaultValue;
}

Это зависит от того, используете ли вы достаточное количество предупреждений компилятора, что отсутствуетПеречислители будут выбраны в switch, конечно.

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