Я не уверен, если это полезно, но я имел следующие мысли:
Мы должны сохранить возможные значения enum
где-то, потому что эта информация не существует в памяти, так что нам нужно что-то как массив с возможными значениями:
enum {
valueA = 5,
valueB = 7,
valueC = 9,
valueD = 14,
valueE = 15
} myEnumType;
const int myEnumTypeArr[] = { 5, 7, 9, 14, 15 };
, где это возможно, чтобы не хранить этот массив, но чтобы создать временный объект всякий раз, когда это необходимо (например, мы могли бы обернуть содержимое массива в макрос).
Я не думаю, что это хорошее решение, потому что если вы измените свой enum
, вы должны изменить массив. Если вы забудете сделать это, компилятор не предупредит вас, и это может привести к труднодоступным ошибкам.
Так, может быть следующее полезным: Вы можете использовать массив для значений и enum
константы в качестве индексов:
enum { valueA, valueB, valueC, dummy } myEnumType; // dummy must stay at last position
const int myEnumTypeArr[] = { 5, 7, 9 };
так что вы используете myEnumTypeArr[valueA]
, а не valueA
непосредственно (с недостатком, что это уже не является константа, например, не может быть использовано в качестве case
этикетки) и, возможно, что-то вроде этого (несколько некрасивого, хотя)
static_assert(sizeof myEnumTypeArr/sizeof *myEnumTypeArr == dummy);
предотвратить вышеупомянутую ошибку.
НТН
Я не уверен, но если 'enum' выделяет память смежно, то вы можете использовать указатель на первый элемент' enum' и увеличить его, чтобы получить следующие элементы. –
Что произойдет, если вы попробуете его. – this
@MadHatter 'enum' объявления, подобные размещенному коду, не выделяют * ничего *; они являются псевдонимом типа и не более того. – WhozCraig