4.8 KiB
Better Enums
Reflective compile-time enum library with clean syntax, in a single header file and without dependencies.
In C++11, everything can be used at compile time. You can convert your enums,
loop over them, find their max,
statically enforce conventions, and pass along the results as
template arguments or to constexpr functions. All the reflection is available
for your metaprogramming needs.
The interface is the same for C++98 — you just have to use most of it at run time only. This library does provide scoped and sized enums, something not built into C++98.
See the project page for full documentation.
Installation
Simply add enum.h to your project — that's it.
Then, include it, and use the BETTER_ENUM macro. Your compiler will generate
the rich enums that are missing from standard C++.
Additional features
- No dependencies and no external build tools. Uses only standard C++, though, for C++98, variadic macro support is required.
- Supported and tested on clang, gcc, and msvc.
- Fast compilation. You have to declare a few dozen enums to slow down your
compiler as much as just including
iostreamdoes. - Use any initializers and sparse ranges, just like with a built-in enum.
- Guaranteed size and alignment — you choose the representation type.
- Stream operators.
- Does not use the heap and can be compiled with exceptions disabled, for use in minimal freestanding environments.
Limitations
The biggest limitation is that the BETTER_ENUM macro can't be used inside a
class. This seems difficult to remove. There is a workaround with
typedef (or C++11 using):
BETTER_ENUM(UniquePrefix_Color, uint8_t, Red, Green, Blue)
struct triplet {
typedef UniquePrefix_Color Color;
Color r, g, b;
};
triplet::Color color;
You can, however, use BETTER_ENUM inside a namespace.
The macro has a soft limit of 64 declared constants. You can extend it by following these instructions. Ultimately, the number of constants is limited by your compiler's maximum macro argument count.
In some cases, it is necessary to prefix constants such as Channel::Red with a
+ to explicitly promote them to type Channel. For example, if you are doing
a comparison:
channel == +Channel::Red
Contact and development
Don't hesitate to contact me about features or bugs: antonbachin@yahoo.com, or open an issue on GitHub.
If you'd like to help develop Better Enums, see CONTRIBUTING.
License and history
Better Enums is released under the BSD 2-clause license. See LICENSE.
The library was originally developed by the author in the winter of 2012-2013 at
Hudson River Trading, as a replacement for an older generator called
BETTER_ENUM.
