Учитывая класс перечисления C ++ 11, есть ли какая-либо шаблонная или другая конструкция для итерации во время компиляции над множеством всех перечислителей? Можно ли определить шаблон, например, инициализировать массив со всеми возможными значениями этого типа enum?
Один из альтернативных методов — прибегнуть к препроцессору.
#define ITERATE_MY_ENUM(_) \
_(A,) \
_(B, =3) \
_(C,) \
_(D, =10)
enum MyEnum {
#define DEFINE_ENUM_VALUE(key, value) key value,
ITERATE_MY_ENUM(DEFINE_ENUM_VALUE)
#undef DEFINE_ENUM_VALUE
};
void foo() {
MyEnum arr[] = {
#define IN_ARRAY_VALUE(key, value) key,
ITERATE_MY_ENUM(IN_ARRAY_VALUE)
#udnef IN_ARRAY_VALUE
};
}
Некоторые могут посчитать это уродливым, но он все еще хранит код DRY.
Нет, такого нет. Также обратите внимание, что тип enum может содержать не только значения перечислителей на законных основаниях, но и любые их комбинации ИЛИ вместе (смутно говоря).
Вы, вероятно, могли бы решить проблему, используя простой генератор кода.
Отражающий комментарий:
Вот хорошее резюме изменений в C ++ 11 относительно перечисления класса. Они касались неявных преобразований, контроля над базовым типом, определения имен, но без изменений фундаментального характера. Перечислители — это всего лишь вещи, близкие к литералам без видимых связей. То, что вы просите, потребовало бы своего рода размышлений, AFAIK, это еще не на горизонте.