Классы перечисления («новые перечисления», «строгие перечисления») решают три проблемы с традиционными перечислениями 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.