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