Рефлексивная библиотека перечислений времени компиляции с чистым синтаксисом, в одном заголовочном файле и без зависимостей.
В C++11 все можно использовать во время компиляции. Вы можете конвертировать перечисления, перебирать их, находить их максимум, статически применять соглашения и передавать результаты в качестве аргументов шаблона или в функции constexpr
. Все отражения доступны для ваших нужд метапрограммирования.
Интерфейс для C++98 такой же — вам просто придется использовать большую его часть только во время выполнения. Эта библиотека предоставляет перечисления с ограниченной областью действия и размером, чего нет в C++98.
Полную документацию смотрите на странице проекта.
Просто добавьте enum.h
в свой проект.
iostream
. Самым большим ограничением является то, что макрос BETTER_ENUM
нельзя использовать внутри класса. Кажется, это трудно удалить. Существует обходной путь с помощью typedef
(или C++11 using
):
BETTER_ENUM (SomePrefix_Color, uint8_t , Red, Green, Blue)
struct triplet {
typedef SomePrefix_Color Color;
Color r, g, b;
};
triplet::Color color;
Однако вы можете использовать BETTER_ENUM
внутри пространства имен.
Макрос имеет мягкое ограничение в 64 объявленных константы. Вы можете продлить его, следуя этим инструкциям. В конечном итоге количество констант ограничено максимальным количеством аргументов макроса вашего компилятора.
В некоторых случаях необходимо добавлять к константам, таким как Channel::Red
, префикс +
чтобы явно преобразовать их в тип Channel
. Например, если вы выполняете сравнение:
channel == +Channel::Red
В msvc вам может потребоваться включить предупреждение C4062, чтобы обеспечить проверку полноты регистра switch
.
Оригинальная версия библиотеки была разработана автором зимой 2012-2013 года в компании Hudson River Trading, как замена более старому генератору под названием BETTER_ENUM
.