Как я могу избежать повторения при создании перечисления 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
};

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

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

DEFINE_GADGET(First)
DEFINE_GADGET(Second)

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

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

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

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

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