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

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

15 голосов
/ 03 августа 2011

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

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

Ответы [ 6 ]

9 голосов
/ 03 августа 2011

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

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

1 голос
/ 28 апреля 2015

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

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)
1 голос
/ 03 августа 2011

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

1 голос
/ 03 августа 2011

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

0 голосов
/ 15 мая 2015

Вы не можете.

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

0 голосов
/ 03 августа 2011

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

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

Так что я не уверен в вашем втором вопросе. Я задал похожий вопрос давно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...