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
这有一个旧的预处理器技巧:
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)