编译时的枚举器序列

时间:2013-06-19 15:32:38

标签: c++ c++11 enums enum-class

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

不,没有这样的事情。另请注意,枚举类型不仅可以合法地保存枚举数的值,还可以保存它们的任意组合(隐约地说)。

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

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