Иерархический непрямоугольный список имен и перечислений в C++98
Я пытаюсь собрать иерархический список перечислений (индексов) и соответствующих им имен, чтобы я мог получить доступ к определенным именам или просматривать их все в зависимости от того, в каком разделе моего кода я нахожусь. Список будет константа однажды скомпилирована, но ее нужно легко изменить в коде. Я использую макросы X, чтобы упростить это, но я немного застрял в том, как добиться гибкости, к которой я стремлюсь. Возможно, я все об этом ошибаюсь.
Эта часть работает:
namespace another
{
// Define individual groups
//-------------------------
// <<Self>> group
#define XLIST \
X(Lat ) \
X(Lon ) \
X(Altitude ) \
X(Weight )
#define X(a) a,
enum class enum_Self { XLIST NUMEL };
#undef X
#define X(a) #a,
const char * const name_Self[] = { XLIST };
#undef X
#undef XLIST
// <<Target>> group
#define XLIST \
X(Lat ) \
X(Lon ) \
X(Altitude )
#define X(a) a,
enum class enum_Target { XLIST NUMEL };
#undef X
#define X(a) #a,
const char * const name_Target[] = { XLIST };
#undef X
#undef XLIST
// List of the "another" groups
//-----------------------------
#define XLIST \
X(Self ) \
X(Target )
// Group name enumeration
#define X(a) a,
enum class groupEnum { XLIST NUMEL };
#undef X
// Group name strings
#define X(a) #a,
const char * const groupName[] = { XLIST };
#undef X
// An array which contains the number of flags in each group
#define X(a) (const int) another::enum_ ##a::NUMEL,
const int groupSize[] = { XLIST };
#undef X
#undef XLIST
} // end another namespace
Затем в main
Я могу перебрать группы, используя что-то вроде этого:
for (int ii=0; ii<(int)another::groupEnum::NUMEL; ii++)
printf("Group %d is %s\n",ii,(int)another::groupName[ii]);
И если я выберу определенную группу по имени, я могу сделать что-то вроде этого:
printf("another::enum_Self contains:\n");
for (int ii=0; ii<(int)another::enum_Self::NUMEL; ii++)
printf("\t%s\n",another::name_Self[ii]);
И я могу получить доступ к конкретному элементу, как это: another::enum_Self::Altitude
Проблема в том, что я не могу пройтись по каждой из групп, а затем по каждому из элементов в этой группе. Я пытался создать массив структур, каждая из которых содержала enum
а также const char * const
массив имен, но я не мог понять, как определить общую структуру заранее, а затем инициализировать ее конкретными значениями. И я не смог создать двумерный массив верхнего уровня, потому что не в каждой группе будет одинаковое количество элементов. Я тоже думал о векторах, но они предназначены для того, чтобы быть динамическими, и весь смысл в том, что эти вещи не должны меняться вообще после компиляции. Я подозреваю, что я просто думаю о проблеме неправильно...