在创建C++枚举和依赖数据结构时,如何避免重复自己?

Gra*_*ner 10 c++ macros enums metaprogramming dry

可能重复:
枚举到字符串:如果无效/未找到,则返回枚举整数值

简而言之,我所拥有的(工作)定义代码是这样的:

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
};
Run Code Online (Sandbox Code Playgroud)

但是,如果信息位于必须手动维护的多个单独位置,则容易出错.(在某些情况下,在代码库中,我正在使用这两个 - 或更多 - 地方甚至不在同一个文件中.)所以,将这些东西命名一次真的很棒.

现在我们可以使用代码生成和声明性数据文件来完成此操作,但是如果有更好的方法,我宁愿不向现有的构建过程添加另一个步骤.拥有看起来像的东西是完美的

DEFINE_GADGET(First)
DEFINE_GADGET(Second)
Run Code Online (Sandbox Code Playgroud)

(如果需要,可选择启动/停止宏)但是,由于宏只是纯文本替换,我无法想出让预处理器在写出枚举定义时"记住"标记的任何方法.

我认为这也可能通过元编程实现,但我对如何做到这一点感到茫然.我在那里看到的所有例子都涉及递归地构建数据结构.我可以看到我如何以这种方式构建字符串数组,但我不确定如何传递令牌名称,或者如何构建枚举.(当然,使用元编程来构建一个字符串数组会非常荒谬.)

有没有办法让我在这里保持DRY,而不使用代码生成?

Mar*_*ork 11

这有一个旧的预处理器技巧:

Gadget.data

DEFINE_GADGET(First)
DEFINE_GADGET(Second)
Run Code Online (Sandbox Code Playgroud)

小工具.**

#define QUOTE_VAL(X)  #X

enum Gadget
{
#define DEFINE_GADGET(X)   X,
#include "Gadget.data"
#undef DEFINE_GADGET(X)
}; 

const char* gadget_debug_names[] = {
#define DEFINE_GADGET(X)   QUOTE_VAL(X),
#include "Gadget.data"
#undef DEFINE_GADGET(X)
};
Run Code Online (Sandbox Code Playgroud)