Иерархический непрямоугольный список имен и перечислений в 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 массив имен, но я не мог понять, как определить общую структуру заранее, а затем инициализировать ее конкретными значениями. И я не смог создать двумерный массив верхнего уровня, потому что не в каждой группе будет одинаковое количество элементов. Я тоже думал о векторах, но они предназначены для того, чтобы быть динамическими, и весь смысл в том, что эти вещи не должны меняться вообще после компиляции. Я подозреваю, что я просто думаю о проблеме неправильно...

0 ответов

Другие вопросы по тегам