Метамакросы вызывают всевозможные разрушения в Intellisense и т.п., но они могут облегчить эту задачу ...
#define MY_ENUMS(e_) \
e_(Enum_A), \
e_(Enum_B), \
e_(Enum_C), \
#define ENUM_EXPANDER(e_) e
enum MyEnums
{
MY_ENUMS(ENUM_EXPANDER)
CountOfMyEnums
};
#define STRING_EXPANDER(e_) #e_
const char* g_myEnumStrings[] =
{
MY_ENUMS(STRING_EXPANDER)
};
Возможно даже
#define CASE_EXPANDER(e_) case e_: return #e_;
const char* GetEnumName(MyEnums e)
{
switch (e)
{
MY_ENUMS(CASE_EXPANDER)
default:
return "Invalid enum value";
}
}
Различные «макросы расширения» могут использоваться для заполнения карт или других структур данных по вашему выбору. Я использовал этот вид ужаса для разбора перечислений из файлов конфигурации (так что автор, который создает файл конфигурации, может использовать перечисление, а не индекс).