gpt4 book ai didi

c++ - 以通用方式选择有效的随机枚举值

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:06 24 4
gpt4 key购买 nike

假设我们有一个枚举类型 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);
  • 创建一个模板类 Incrementing,其中连续变量默认由递增的 static 成员初始化,但可以从任何基础类型分配给 (例如 int)。

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

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

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

我多年前写的这个概念有一个完全矫枉过正的版本 here ,但鉴于您的简单要求,我建议您从头开始。

关于c++ - 以通用方式选择有效的随机枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com