Сначала я научился программировать на Java, и поэтому при работе с перечислениями я мог использовать .values()
чтобы получить массив всех значений в этом конкретном перечислении. Я заметил, что сейчас, изучая C ++, не существует эквивалентного метода.
Каков наилучший способ справиться с этим, так как я уверен, что люди придумали достойные обходные пути?
Для этого в C ++ обычно требуется специальное значение часового в перечислении или некоторая магия препроцессора.
Если ваши перечислители являются последовательными, то вы можете использовать простое значение часовогоend
в этом случае):
enum my_enum {
a,
b,
c,
my_enum_end,
};
for (int i = 0; my_enum_end != i; ++i) {
// Loop through all of the enum values.
}
Если перечисление более сложное и между каждым перечислителем есть пробелы, вы можете использовать препроцессор:
#define ENUMS(F) F(a, 1) F(b, 5) F(c, 10)
#define AS_ENUM(ID, V) ID = V,
#define AS_VALUE(ID, V) V,
#define AS_ID(ID, V) #ID,
enum my_enum {
ENUMS(AS_ENUM)
};
my_enum const my_enum_values[] = {ENUMS(AS_VALUE)};
std::string const my_enum_keys[] = {ENUMS(AS_ID)};
for (my_enum const i : my_enum_values) {
// Loop through all of the enum values.
}
for (auto const& i : my_enum_keys) {
// Loop through all of the enum keys.
}
Здесь все перечислители указаны в ENUMS
макрос, а не внутри enum
определение напрямую.
Других решений пока нет …