Можно ли написать анонимный класс enum и затем сравнить его содержимое? Например.
enum class { APPLE, BANANA } fruitType;
// ...
if (fruitType == fruitType::APPLE)
// ...
Можно ли написать анонимный класс enum и затем сравнить его содержимое? Например.
enum class { APPLE, BANANA } fruitType;
// ...
if (fruitType == fruitType::APPLE)
// ...
Нет, fruitType
- переменная (несмотря на тип в имени). Вы не можете использовать имя переменной для доступа к вещам о своем типе.
Идея с enum class
заключается в том, что значения не видны вне определения, если вы не префикс их имени типа. Если тип не имеет имени, это будет сложно!
Не так. fruitType::APPLE
неверно, поскольку fruitType
не является именем пространства имен. Однако, если вы просто пишете fruitType == APPLE
(без префикса APPLE
), тогда это отлично.
Я бы сказал, что это не имеет смысла. Это разрушает всю идею класса enum, которая была введена для решения некоторых проблем традиционных перечислений (экспорт перечислителей в окружающую область, неявное преобразование в int, невозможность указать базовый тип). Если вы объявляете анонимный класс enum, его счетчики недоступны, так как они не могут быть квалифицированы. Поэтому это не имеет никакого смысла.
Да, это возможно. Но если он будет анонимным, он не будет доступен вне его сферы.
Изменить. Вторая часть вопроса - ошибка. Вам не нужно упоминать 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. Итак, вы должны сделать компромисс: выберите обе функции или нет.