2013-03-14 1 views
4

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

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

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

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

EDIT: Я предпочитаю решение C++ 03, если это возможно, потому что текущий экземпляр проблемы требует его, но если не C++ 11 хорошо знать.

+2

если они являются последовательными и, начиная с нуля, вы можете добавить 'total' элемента, как в прошлом ENUM, который значение становится равным числу значений =) – kassak

+1

Хорошее замечание от @kassak' total' или 'colors_count' в качестве последнего элемента перечисления очень полезно во многих случаях – borisbn

+0

@kassak Я знаю об этом трюке, но это зависит от комментариев CAPS LOCK, которые предотвращают переход ppl и определяют значение int каждого перечисления. :) – NoSenseEtAl

ответ

7

Это вариант:

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

это C + 11, правильно? – NoSenseEtAl

+0

О, очень приятно. +1 –

+0

@NoSenseEtAl Да, списки инициализаторов. – Pubby

4

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

0

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

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

+0

Ну, определение '++' будет содержать приведение. – Potatoswatter

+0

Да, но петля не будет. Вы будете иметь дело с интерфейсом, который скрывает детали. –

Смежные вопросы