C++ compile-time enum to string, iteration, in a single header file
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 C98 — you just have to use most of it at
run time only. This library does provide scoped and sized enums, something not
built into C98.
See the project page for full documentation.
Simply add enum.h
to your project.
iostream
does.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(SomePrefix_Color, uint8_t, Red, Green, Blue)
struct triplet {
typedef SomePrefix_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
On msvc, you may need to enable warning C4062 to get switch
case exhaustiveness checking.
The original version of the library was developed by the author in the winter of
2012-2013 at Hudson River Trading, as a replacement for an older generator
called BETTER_ENUM
.