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

标签 c++ macros enums metaprogramming dry

<分区>

Possible Duplicate:
Enum to string : return the enum integer value if invalid / not found

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

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)

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

我认为这也可以通过元编程来实现,但我不知道该怎么做。我在那里看到的所有示例都涉及递归构建数据结构。我可以看到如何以这种方式构建字符串数组,但我不确定如何传递 token 名称或如何构建枚举。 (当然,仅使用元编程来构建字符串数组是非常荒谬的。)

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

最佳答案

有一个古老的预处理器技巧:

小工具.数据

DEFINE_GADGET(First)
DEFINE_GADGET(Second)

小工具。**

#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)
};

关于c++ - 在创建 C++ 枚举和依赖数据结构时如何避免重复自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13154543/

相关文章:

字符串文字开始迭代器和结束迭代器的 C++ 宏

enums - 类型常量声明列表

java - 是否可以强制接口(interface)仅由枚举实现?

c++ - 为什么我可以将 ifstream 文件置于 if 条件中?

c++ - SFINAE 在 decltype 中使用范围解析运算符

c - 如何在 C 中实现通用宏?

visual-studio-code - 记录 'macro' ?还是 Visual Studio Code 中的一系列操作?

java - Jpa Enum 如何映射到其中有空格的列值?

c++ - 使用多个字符串定界符拆分字符串

c++ - 在 gdb 中设置一个文件范围的断点