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

假设我们有一个枚举类型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) );

因为:

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

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

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

托尼·德罗伊

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

  • 调用可变参数宏:

    ENUM(E,
         v1 = uE1,
         v2 = uE2,
         // ...
         vN = uEN);
    
  • 创建一个模板化类Incrementingstatic默认情况下,递增成员初始化连续变量,但是可以根据您的基础类型(例如int将其分配给它

    static Incrementing<E, Underlying> __VA_ARGS__; \
    
  • 使用上面的值用值初始化数组Incrementing(需要一个operator Underlying() const成员)。

    static const Underlying values[] = { __VA_ARGS__ }; \
    

然后,values[]数组包含命名的枚举值。

我几年前在这里写过这个概念的完整版本,但是鉴于您的简单要求,我建议您从头开始。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从scala枚举中有效地选择随机元素?

从列表理解和一般情况下有效创建numpy数组

使用枚举之前检查有效的枚举值

带有接口的枚举-一般如何操作?

为什么运算符AND在tsql中返回错误,这在一般sql中似乎是有效的

有效地选择随机数

随机选择设置位的有效方法

ActiveRecord枚举错误:“不是有效值”

一般选择所有数据属性元素

枚举唯一的无向路径的有效方法

应用一般枚举成员或方法

一般调用的枚举模板函数

spring-boot:确保提交的值是一组给定的有效选择之一

如何选择随机枚举值

如何有效地将此代码实现到此 GUI 中?(我是编码新手)只是要求一个一般的想法或提示

从枚举的子部分中选择一个随机值

从枚举中选择一个随机值?

有没有一种有效的方法可以从结构中获取随机值?

有没有一种更有效的方法来枚举python或R中离散随机变量的每个可能结果的概率?

如何测试一个值是否不等于任何有效选择

如何从tensorflow RNN中选择最后一个有效的输出值

有效选择与Pandas DataFrame中的几个值之一匹配的行

如何从数据框中的一组变量中有效选择随机变量样本

选择一个有效的选择ModelChoiceField

是没有值的选择选项有效吗?

如何根据当前枚举值选择具有限制的随机枚举值?

Typescript枚举比较“有效”有效,但“ ===”无效

SQL有效地选择值,该值在另一个表中有记录

如何从具有有效值的最后一行和第一行中选择列名?