Не знаю, что за заморочки с enum'ами у вас там в C++, но во многих других языках, enum — это просто конечное множество литералов с, опционально, приаттаченными к ним какими-то свойствами и получить массив всех значений enum'ного типа не представляет никакой проблемы.
Угу. Но в C/C++ это не так. С подобными перечислениями:
enum
{
RED,
GREEN,
BLUE,
GRAY
};
архитектурных проблем не возникает, но вот с подобными:
enum
{
RED = 1,
GREEN = 2,
BLUE = 4,
GRAY =-1
};
всплывает целый комплекс проблем. По Стандарту C++ валидными значениями для этого перечисления будут [-8...7]. Неожиданно? И неважно, что только четыре из них имеют идентификаторы. Причём это касается только дополнительного кодирования целых, для других вариантов диапазон будет [-7...7], и определяется это как поведение, зависящее от реализации, в данном случае от архитектуры исполнительного устройства. Внимание – вопрос: когда программист хочет коллекцию элементов перечисления, какой из этих двух вариантов он имеет в виду? Валидные значения или-таки явным образом определённые идентификаторы? Внимание – вопрос 2: когда он к GREEN делает ++, он хочет следующее значение или следующий идентификатор? А если к BLUE? А если к GRAY... или -- к RED? А когда он выводит их в поток, он реально хочет увидеть "RED" на выходе? А если вводит, например, из файла, то "Red" подойдёт как значение, кодируемое 1? А если он русский, выставил себе std::locale("ru_RU.UTF8") и хочет видеть "КРАСНЫЙ"?
Где, в каком Стандарте и как именно это всё прописывать? А главное — зачем вообще пытаться натягивать сову на глобус, если перечисления всегда были предназначены для представления в коде дискретных входов. Даже название "перечисление" говорит, что это просто список значений. Режимы работы стиральной машины, каналы ТВ, список форсмажорных обстоятельств в договоре, типы внешних интерфейсов в ПК, список поддерживаемых движком графических API... А то, что язык позволяет с ними ещё и дополнительные выкрутасы вытворять, так это просто бонус. Мол, хотите юзать, на здоровье, под вашу ответственность.
Меня тут пытаются подвести под обвинение за слишком узкий взгляд на программирование в связи с моим крайне лояльным отношением к C++ и более прохладным отношением к остальным языкам. По факту же наоборот, это пока единственный встретившийся мне язык, который не сосредотачивается на популизме масс в контексте популярности трендов, а ориентирован на программирование с точки зрения научного подхода к IT.