So I have a simple enough problem. I have a series of named data objects
and a container class
where there are
COUNT of these items, each with a name, type and default value, and the
Initialise method where heap allocations are done outside the constructor -- it simply fills in the array with appropriately typed named values with their default values, and I want client code to be able to index the array with symbolic names.
Plain enums don't have a to-string (though there are tricks to auto-associate names with strings by simple preprocessor metaprogramming); to get a compile-time count there's the old stand-by of putting an extra dummy member at the end and a big fat comment about inserting new values above it.
C++11 enum classes don't give me anything over the older enums here. There are various enum-like classes out there, in varying degrees of complexity; these give type-safety (which I don't really need in this context), could be extended with extra data, can be iterated over -- but don't give a compile-time count.
Time to break out Boost for some industrial grade tooling, and be very glad that my compiler supports variadic macros.
I want to define my items one time, one place, no extras like
Let's start with basing our enum representation off the Boost MPL wrapper for
with static initialization
and from there it's just a case of using the preprocessor metaprogramming to put the bits together, just iterating over the definitions to define all the types, their static initialization and the array initialization:
Then in the Items.h header file where I defined
Items, realise the common parts:
and the Items.cpp file realises the initialisations
and consumers have a tolerable symbolic constant access to the values
while extending the list only has to happen in one place.
I'm just not sure if it's a bit too magic for the purpose.