0

给定一个 C++11 枚举类,是否有一些模板或其他构造在编译时迭代所有枚举器的集合?是否可以定义一个模板来例如用该枚举类型的所有可能值初始化一个数组?

4

2 回答 2

3

一种替代技术是求助于预处理器。

#define ITERATE_MY_ENUM(_) \
  _(A,) \
  _(B, =3) \
  _(C,) \
  _(D, =10)

enum MyEnum {
  #define DEFINE_ENUM_VALUE(key, value) key value,

  ITERATE_MY_ENUM(DEFINE_ENUM_VALUE)

  #undef DEFINE_ENUM_VALUE
};

void foo() {
  MyEnum arr[] = {
    #define IN_ARRAY_VALUE(key, value) key,

    ITERATE_MY_ENUM(IN_ARRAY_VALUE)

    #udnef IN_ARRAY_VALUE
  };
}

有些人可能认为它丑陋,但它仍然保持代码DRY

于 2013-06-20T14:27:20.400 回答
1

不,没有这样的事情。另请注意,枚举类型不仅可以合法地保存枚举器的值,还可以将它们的任何组合或组合在一起(模糊地说)。

您可能可以使用一些简单的代码生成器来解决问题。

反映评论: 是 C++11 中关于类枚举的变化的一个很好的总结。这些解决了隐式转换、对底层类型的控制、名称范围,但基本性质没有改变。枚举器仍然只是接近文字的东西,没有可发现的连接。你所要求的将需要某种反思,AFAIK 它还没有出现。

于 2013-06-19T15:35:14.373 回答