如何优雅地将所有枚举放入std::集中
How to elegantly put all enums into a std::set
我有一个枚举,我想把它们都放在集合中(然后用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
。
就我个人而言,我会使用一个循环,并在执行过程中进行投射。
但是,如果您对强制转换一筹莫展,则可以在枚举上定义运算符,以便使用++
对它们进行迭代。这样你就可以在不施法的情况下循环。
相关文章:
- C++17:使用 std::optional 来评估枚举是否包含值
- 无法让"std::enable_if"适用于无作用域枚举
- C++ 使用枚举类对象分配 std::map 值
- 重载 std::字符串运算符+ 用于打印枚举名称
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- 在枚举类型上使用std::max是不是一种糟糕的做法
- 试图让我的枚举等同于 std::error_code
- C++枚举类 std::size_t 隐式转换
- std::初始值设定项列表来自现有的 std::array,而不枚举每个元素
- std::映射键作为模板化结构与枚举成员
- 如何将带有"any"枚举的 std::map 传递给函数
- 带有constexpr std :: string_view vs用std :: string实例化枚举的枚举
- 初始化枚举类 (C++11) 类型的二维 std::数组
- static_cast 使用 std::get 与枚举类时必需的
- 如何有效地用枚举填充 2D std::数组
- 扩展 std::to_string 以支持枚举和指针
- 如何将C 枚举类枚举作为std ::阵列索引而没有明确的铸件
- 是否可以将std :: byte用作枚举类的基础类型
- 创建一个 std::vector 的枚举