Последовательность перечислителей во время компиляции

Учитывая класс перечисления C ++ 11, есть ли какая-либо шаблонная или другая конструкция для итерации во время компиляции над множеством всех перечислителей? Можно ли определить шаблон, например, инициализировать массив со всеми возможными значениями этого типа enum?

0

Решение

Один из альтернативных методов — прибегнуть к препроцессору.

#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.

3

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

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

Вы, вероятно, могли бы решить проблему, используя простой генератор кода.

Отражающий комментарий:
Вот хорошее резюме изменений в C ++ 11 относительно перечисления класса. Они касались неявных преобразований, контроля над базовым типом, определения имен, но без изменений фундаментального характера. Перечислители — это всего лишь вещи, близкие к литералам без видимых связей. То, что вы просите, потребовало бы своего рода размышлений, AFAIK, это еще не на горизонте.

1

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