以一般方式选择有效的随机枚举值

tsu*_*uki 5 c++ random enums c++11

假设我们有一个枚举类型E.

enum class E : underlying_type_of_E {
 v1 = uE1,
 v2 = uE2,
   //...
 vN = uEN
};

typedef typename std::underlying_type<E>::type uE;
Run Code Online (Sandbox Code Playgroud)

一般而言,并非所有值uE都是有效值E,因为我们可以选择它们之间的关系.是否有一种创建随机,有效(在定义中命名,不可分配),E的值的一般方法?例如,这不起作用:

std::mt19937 m;
std::uniform_int_distribution<uE> randomUE(0, std::numeric_limits<uE>::max());

E e = static_cast<E>( randomUE(m) );
Run Code Online (Sandbox Code Playgroud)

因为:

  1. 值范围可能不是从0开始
  2. 值范围可能不会以std :: numeric_limits :: max()结束
  3. 值范围可能根本不是范围 - 我们可以从uE中选择E的离散值,例如{1,3,62,272}.

鉴于所有枚举值在编译时都是已知的,我无法想象为什么这会以任何方式危险或容易出错.

至于为什么我想要这样的事情 - 我正在研究一种使用模板化基因存储的遗传算法.现在,我使用枚举作为染色体并将它们存储在按需std::vector<bool>转换中std::vector<enumT>.这种方法的问题是以给定概率翻转随机位的突变.这可能会导致问题,因为它会产生无效的染色体,这些染色体是未命名的枚举值.

Ton*_*roy 2

如果您准备使用预处理器宏来创建类型enum和有关它的一些元数据,则可以执行此操作,但这是一个小麻烦:

然后该values[]数组包含命名的枚举值......

我几年前在这里写过这个概念的一个完全矫枉过正的版本,但考虑到您的简单要求,我建议从头开始。