如何优雅地将所有枚举放入std::集中

How to elegantly put all enums into a std::set

本文关键字:std 枚举 集中 何优雅      更新时间:2023-10-16

我有一个枚举,我想把它们都放在集合中(然后用set_intersection算法删除一些,但这是离题的(。一切都很好,除了我被困在第一步。:(

如果我有(真实类有基数更高的枚举(

class MyClass
{
enum Color{red, green , blue}
};

如何初始化std::set<MyClass::Color>以包含所有枚举
很明显,我可以手动一个接一个地插入它们,做一个带有强制转换的for循环,因为它们是连续的,并且从0开始(我认为如果我在枚举定义中不使用=,这是必需的(,但我正在寻找一种更优雅的方式。

编辑:如果可能的话,我更喜欢C++03解决方案,因为当前的问题实例需要它,但如果不是,C++11也很好。

这是一个选项:

#define COLORS {red, green , blue}
enum Color COLORS;
static std::set<Color> color_set() {
    return COLORS;
}
#undef COLORS

使用std::bitset< total_colors >。对于有限空间上的集合来说,这是一个更合适的数据结构。每种颜色都映射到一个布尔值,表示它是否是集合的一部分。您可以使用my_bitset.set()将其初始化为所有的true

就我个人而言,我会使用一个循环,并在执行过程中进行投射。

但是,如果您对强制转换一筹莫展,则可以在枚举上定义运算符,以便使用++对它们进行迭代。这样你就可以在不施法的情况下循环。