Tables in C++ has always been quite ugly and error-prone with separate enums and arrays. Matching these can become difficult when more rows are added.
Making a code generator might be overkill for something this simple, because it affects the whole build system and usually ends up becoming a new compiler taking more time to maintain than the project itself. Generating lists from macros looks worse than redundancy. Plain arrays and lists cannot handle opaque handles and indices, because side-effects are forbidden in global construction. Dynamically loaded files don't allow naming core members with identifiers (needs slow run-time search on every access). Using a function for each property is slow and makes it hard to add another table row across each attribute.
Maybe there's a better solution for simple non-redundant tables in C++?