以最新的C 的类型安全方式从枚举中随机选择元素

Randomly select an element from an enumeration in a type-safe way with newest C++

本文关键字:随机 选择 枚举 元素 方式 最新 类型安全      更新时间:2023-10-16

是否有一种方法可以以类型安全的方式从枚举中随机选择元素?

我能找到的最好的方法是将终结值作为枚举的最后一个元素引入终结值,因此您知道有多少个值,然后在您施放的适当范围内生成一个随机整数到枚举。但是终结器值并不代表任何内容,因此您具有无效的枚举值,这不是类型的安全。在最新的C 标准中,有更好的方法吗?

这似乎是std::map

的好用例
std::map<std::string, const int> nicer_enum {{"Do", 3}, {"Re", 6}, {"Mi", 9}};
std::cout << nicer_enum["Re"] << 'n'; // 6
auto elem = nicer_enum.cbegin();
std::srand(std::time(nullptr));
std::advance(elem, std::rand() % nicer_enum.size());
std::cout << elem->second << 'n'; // 3, 6 or 9
for (const auto &kv : nicer_enum)
        std::cout << kv.first << ": " << kv.second << ' '; // Do: 3 Mi: 9 Re: 6
std::cout << 'n';