使用最新的C ++

时间:2016-11-27 08:58:40

标签: c++ enums type-safety

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

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

1 个答案:

答案 0 :(得分: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';