Классы перечисления («новые перечисления», «строгие перечисления») решают три проблемы с традиционными перечислениями C ++:
- обычные
enums
неявно конвертируются в int
, вызывая ошибки, когда кто-то не хочет, чтобы перечисление действовало как целое число.
- обычный
enums
экспорт их перечислителей в окружающую область видимости, вызывая конфликты имен.
- Базовый тип объекта не
enum
может быть указан, что вызывает путаницу, проблемы совместимости и делает невозможным предварительное объявление.
enum class
("строгие перечисления") строго типизированы и имеют область видимости:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Как показано, традиционные перечисления работают как обычно, но теперь вы можете при желании указать имя перечисления.
Новые перечисления являются «классом перечисления», потому что они сочетают в себе аспекты традиционных перечислений (имена значений) с аспектами классов (элементы с заданной областью действия и отсутствие преобразований).
Возможность указать базовый тип упрощает взаимодействие и обеспечивает гарантированные размеры перечислений:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
Это также позволяет прямое объявление перечислений:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Базовый тип должен быть одним из целочисленных типов со знаком или без знака; по умолчанию int
.
В стандартной библиотеке enum
классы используются для:
- Картирование системы специфические коды ошибок: В
<system_error>
: enum class errc
;
- Указатели безопасности: В
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Ошибки потока ввода-вывода: В
<iosfwd>
:enum class io_errc { stream = 1 };
- Обработка ошибок асинхронной связи: В
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Некоторые из них имеют операторы, например ==
defined.
enum class Colours
иenum class Fruits
. Потому что, когда я писал код в VS 2010. Он выдает ошибку"expects a defination or a tag name"
подclass
.