Анонимные классы перечисления



Можно ли написать анонимный класс enum и затем сравнить, что он содержит? Напр..



enum class { APPLE, BANANA } fruitType;
// ...
if (fruitType == fruitType::APPLE)
// ...
542   6  

6 ответов:

Нет, fruitType является переменной (несмотря на тип в имени). Вы не можете использовать имя переменной для доступа к информации о ее типе.

Идея с enum class заключается в том, что значения не видны за пределами определения, если вы не добавляете к ним имя типа. Если у типа нет имени, это будет трудно!

Я бы сказал, что это не имеет смысла. Это ломает всю идею класса enum, который был введен для решения некоторых проблем традиционных перечислений (экспорт перечислителей в окружающую область, неявное преобразование в int, Невозможность указать базовый тип). При объявлении анонимного класса перечисления его перечислители недоступны, так как они не могут быть квалифицированы. Так что это не имеет никакого смысла.

Не так. fruitType::APPLE неверно, так как fruitType не является именем пространства имен. Однако, если вы просто пишете fruitType == APPLE (без префикса APPLE), то это нормально.

Да, это возможно. Но если он будет анонимным, то он не будет доступен вне его какой-либо области.

Edit: ваша вторая часть вопроса-ошибка. Вы не должны упоминать fruitType::. Однако даже после его удаления компиляция завершается неудачей. А это значит, что он непригоден для использования.

Так что я не уверен насчет вашего второго вопроса. Я уже давно задавал подобный вопрос.

Вы не можете этого сделать:

enum class { APPLE, BANANA } fruitType;
if (fruitType == fruitType::APPLE)

Но вы можете сделать это:

enum class FT { APPLE, BANANA } fruitType;
if (fruitType == FT::APPLE)

...что, вероятно, так же просто.


Обратите внимание, что вы, вероятно, хотите инициализировать его:

enum class FT { APPLE, BANANA } fruitType = FT::BANANA;
if (fruitType == FT::APPLE)

Ты не можешь.

Но я согласен, что было бы неплохо иметь возможность сделать это. Иногда перечисление уже является частью достаточно вложенной и ограниченной области, и дальнейшая квалификация была бы чистым перебором, но вы все равно хотели бы запретить преобразование в int. Таким образом, вы должны сделать компромисс: выбрать обе функции или ни одну из них.

Comments

    Ничего не найдено.