假设我们有一个枚举类型E
。
enum class E : underlying_type_of_E {
v1 = uE1,
v2 = uE2,
//...
vN = uEN
};
typedef typename std::underlying_type<E>::type uE;
通常,并非的所有值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) );
因为:
鉴于所有枚举值在编译时都是已知的,所以我无法想象为什么这会导致危险或容易出错。
至于为什么我想要这样的事情的背景-我正在研究一种使用模板化基因存储的遗传算法。现在,我将枚举用作染色体并将其存储在std::vector<bool>
其中,并std::vector<enumT>
根据需要将其转换为染色体。这种方法的问题是以给定的概率翻转随机位的突变。这可能会引起问题,因为它会产生未命名的枚举值的无效染色体。
如果准备使用预处理器宏来创建enum
类型和有关它的一些元数据,则可以执行此操作,但这是一个小麻烦:
调用可变参数宏:
ENUM(E,
v1 = uE1,
v2 = uE2,
// ...
vN = uEN);
创建一个模板化类Incrementing
,static
默认情况下,递增成员初始化连续变量,但是可以根据您的基础类型(例如int
)将其分配给它。
static Incrementing<E, Underlying> __VA_ARGS__; \
使用上面的值用值初始化数组Incrementing
(需要一个operator Underlying() const
成员)。
static const Underlying values[] = { __VA_ARGS__ }; \
然后,values[]
数组包含命名的枚举值。
我几年前在这里写过这个概念的完整版本,但是鉴于您的简单要求,我建议您从头开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句