Как элегантно поместить все перечисления в std :: set

У меня есть enum, и я хочу поместить их все в набор (а затем удалить некоторые с помощью алгоритма set_intersection, но это оффтоп).
Все отлично работает, кроме того, что я застрял на шаге 1. 🙂

Если у меня есть (реальный класс имеет enum с большей мощностью)

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

Как бы я начал std::set<MyClass::Color> содержать все перечисления.
Очевидно, что я могу вручную вставить их один за другим, выполнить цикл for с приведением типов, поскольку они являются последовательными и начинаются с 0 (я думаю, что это необходимо, если я не использую = в определении enum), но я ищу более элегантный способ.

РЕДАКТИРОВАТЬ: Я предпочитаю решение C ++ 03, если это возможно, потому что текущий случай проблемы требует этого, но если нет, то C ++ 11 тоже полезно знать.

4

Решение

Это вариант:

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

Другие решения

Использовать std::bitset< total_colors >, Это более подходящая структура данных для множества над конечным пространством. Каждый цвет отображается на логическое значение, представляющее, является ли оно частью набора. Вы можете инициализировать его для всех trueиспользую my_bitset.set(),

4

Лично я бы использовал петлю и просто бросал вещи по ходу дела.

Тем не менее, если вы полностью настроены против приведений, вы можете определить операторы в перечислении, чтобы вы могли перебирать их, используя ++, Таким образом, вы можете зацикливаться без приведения.

0
По вопросам рекламы [email protected]