Подтвердить что ты не робот

Анонимные классы enum

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Поэтому я не уверен в вашем втором вопросе. Я долгое время задавал аналогичный вопрос.

Ответ 5

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

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)

Ответ 6

Вы не можете.

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