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

hkB*_*Bst 8 c++ enums type-safety

有没有办法以类型安全的方式从枚举中随机选择一个元素?

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

Ray*_*mel 3

这似乎是一个很好的用例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';
Run Code Online (Sandbox Code Playgroud)