Как я могу избежать повторения при создании перечисления C ++ и зависимой структуры данных? [Дубликат]

Возможный дубликат:
Перечисление в строку: возвращает целочисленное значение перечисления, если неверно / не найдено

Вкратце, (рабочий) код определения, который у меня есть, выглядит примерно так:

enum Gadget
{
    First,
    Second,
}; 

const char* gadget_debug_names[] = {
    "First",
    "Second",
    // note: strings are same as enum tokens here, but bonus points if
    //       they can optionally be given different values
};

Тем не менее, это подвержено ошибкам, что информация находится в нескольких отдельных местах, которые должны поддерживаться вручную. (И в некоторых случаях в кодовой базе я работаю с этими двумя или более местами, которые в настоящее время даже не находятся в одном и том же файле.) Поэтому было бы очень приятно просто назвать эти вещи один раз.

Теперь мы можем сделать это с помощью генерации кода и декларативного файла данных, но я бы предпочел не добавлять еще один шаг в существующий процесс сборки, если есть лучший способ сделать это. Было бы идеально иметь что-то похожее

DEFINE_GADGET(First)
DEFINE_GADGET(Second)

(опционально с макросами start / stop, если необходимо) Но, поскольку макросы - это просто подстановка простого текста, я не могу придумать, как препроцессор «запомнил» токены во время записи определения перечисления.

Я думал, что это также возможно через метапрограммирование, но я не знаю, как это сделать. Все примеры, которые я видел, включают рекурсивное построение структуры данных. Я вижу, как я могу построить массив строк таким образом, но я не уверен, как мне передать имя токена или как создать перечисление. (И, конечно, использование метапрограммирования просто для создания массива строк было бы довольно нелепо.)

Можно ли как-нибудь сохранить здесь СУХОЙ, не используя генерацию кода?

Ответы на вопрос(3)

Ваш ответ на вопрос