Что такое enum класс и почему я должен волноваться?

Для того, кто никогда не писал ни одной строки на C ++ 11 и у кого на данный момент нет возможности программировать на C ++ 11, вы можете в одном коротком абзаце сказать:

Что такое «enum class» и зачем он нам нужен?

6

Решение

enum class называется Перечисление в области. Это предотвращает загрязнение пространства имен, в котором появляется перечисление с именами перечислителей.

В C ++ 03 вы могли бы эффективно сделать то же самое, поставив enum внутри выделенного class, Возможно, это источник синтаксиса, который немного сбивает с толку.

Другое отличие состоит в том, что перечислители такого типа не преобразуются неявно в int (static_cast<int> необходимо). Это может быть редко необходимый но это безопасно перегрузить функцию, принимая int спор с одним взятием enum тип. Вы можете быть уверены, что int не будет вызван случайно. Или вы можете определить псевдо-интегральные типы с выделенным operator функции, и убедитесь, что встроенные операторы не будут мешать.

Немного раздражает, что эти два несвязанных различия находятся в одном пакете, и что вы не можете получить незаданной перечисление без неявного преобразования, но обычно оба изменения являются хорошими вещами и enum class является хорошей практикой по умолчанию в C ++ 11.

РЕДАКТИРОВАТЬ: Перечисление области видимости определяется так:

enum class duck { huey, dewey, louie };

и должен использоваться с оператором разрешения области :: как это:

duck culprit = duck::huey; // or "auto culprit" to avoid redundancy

Обратите внимание, что :: Оператор также работает с перечислениями C ++ 03 с незаданной областью, поэтому вторая строка выше будет работать, даже если первая отсутствует class,

Это может быть чрезмерной детализацией, но class не входит в уточненный тип Спецификатор если вперед объявить перечислимый тип, как в

void quack( enum duck whom ); // not "enum class"

Тем не менее, есть новая конструкция в C ++ 11, непрозрачное-перечисление декларация, который включает в себя class Ключевое слово и определяет полный тип.

enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int

Ключевое слово struct можно заменить class без семантической разницы.

13

Другие решения

  1. Вы можете явно указать тип хранилища, когда важен размер данных (возможно, упаковав его в структуру).
  2. Значения перечисления находятся в пределах имени перечисления только; до c ++ 11 они просочились во вмещающую область.
  3. Кажется, я помню, что правила конвертации тоже несколько изменились …

По отношению к пункту 1, размер хранилища enums изменяется до C ++ 11 в зависимости от наибольшего значения, присвоенного перечислению. Обычно это не так важно, но когда нужно, приходится прибегать к уродливым хакерам, чтобы увеличить размер.

Что касается точки 3, в C ++ 11 enumне являются неявно конвертируемыми или сопоставимыми с intс или другой enum Типы: полезно, чтобы избежать головной боли перегрузки функций и других ошибок неявного преобразования.

0

Лично я использовал его в протоколе обмена сообщениями на основе протокола tcp: многие поля представляли собой перечислимые значения, необходимые для кодирования только внутри одного байта, чтобы уважать интерфейс обмена сообщениями ..

Все мои перечисления были просто определены следующим образом:

enum class EnumFieldA : unsigned char { eValProperty1, eValProperty2};
enum class EnumFieldB : unsigned char { eValProperty1, eValProperty2, eValProperty3};
enum class EnumFieldC : unsigned char { eValProperty1, eValProperty2, eValProperty3, eValProperty4};
...

Есть также много подробных ответов в этот ТАК вопрос.

0

Сначала я был озадачен вашим вопросом, но я думаю, что вы хотите знать разницу между enum-ом c ++ и c ++ 11. Насколько я могу понять, в последующем вы строго указали перечисления, что позволяет вам охватить их. Я думаю этот хорошо объясняет CHEERS

-1
По вопросам рекламы [email protected]