У меня есть enum, и я хочу поместить их все в набор (а затем удалить некоторые с помощью алгоритма set_intersection, но это оффтоп).
Все отлично работает, кроме того, что я застрял на шаге 1. 🙂
Если у меня есть (реальный класс имеет enum с большей мощностью)
class MyClass
{
enum Color{red, green , blue}
};
Как бы я начал std::set<MyClass::Color>
содержать все перечисления.
Очевидно, что я могу вручную вставить их один за другим, выполнить цикл for с приведением типов, поскольку они являются последовательными и начинаются с 0 (я думаю, что это необходимо, если я не использую = в определении enum), но я ищу более элегантный способ.
РЕДАКТИРОВАТЬ: Я предпочитаю решение 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 >
, Это более подходящая структура данных для множества над конечным пространством. Каждый цвет отображается на логическое значение, представляющее, является ли оно частью набора. Вы можете инициализировать его для всех true
использую my_bitset.set()
,
Лично я бы использовал петлю и просто бросал вещи по ходу дела.
Тем не менее, если вы полностью настроены против приведений, вы можете определить операторы в перечислении, чтобы вы могли перебирать их, используя ++
, Таким образом, вы можете зацикливаться без приведения.