Перечисление C++ от символа

5 ответов

Вы не можете неявно преобразовать char в enum - вы должны сделать это явно:

return curr_tok = static_cast<token_value> (ch);

Но будьте осторожны! Если ни одно из значений enum не соответствует вашему char , тогда будет сложно использовать результат :)

8
ответ дан 13 December 2019 в 05:39
поделиться

Обратите внимание, что приведенные решения (т. Е. Говорящие вам использовать static_cast ) работают правильно только потому, что, когда были определены символы перечисления, символы (например, PLUS ) были определены как имеющие физическое / числовое значение, которое оказывается равным значению базового символа (например, '+' ).

Другой способ (без использования приведения) - использовать операторы switch / case для явного указания значения перечисления, возвращаемого для каждого символьного значения, например:

    case '*':
      return curr_tok=MUL;
    case '/':
      return curr_tok=DIV;
4
ответ дан 13 December 2019 в 05:39
поделиться

Вам нужно явное приведение:

curr_tok = static_cast<token_value>(ch);

Причина в том, что преобразовывать целочисленный тип в перечисление опасно. Если значение недопустимо для перечисления, поведение не определено. Таким образом, язык не позволяет сделать это случайно с помощью неявного преобразования. Явное преобразование должно означать: «Я знаю, что делаю, и я проверил, что значение допустимо».

1
ответ дан 13 December 2019 в 05:39
поделиться

Думаю, я бы не стал пытаться явно устанавливать значения символов перечисления и вместо этого писать регистр для каждого символа в вашем операторе switch. Сделать это таким образом, вероятно, будет сложнее отлаживать, если что-то пойдет не так, а затраты на производительность при написании регистра для каждого символа настолько низки, что это даже не стоит рассматривать (если вы не пишете для какой-то чрезвычайно низкой встраиваемой системы и, наверное, все равно того не стоит).

0
ответ дан 13 December 2019 в 05:39
поделиться
return curr_tok=(token_value)ch;
-1
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: