(Как) я могу посчитать пункты в enum?

Этот вопрос прибыл по моему мнению, когда у меня было что-то как

enum Folders {FA, FB, FC};

и требуемый, чтобы создать множество контейнеров для каждой папки:

ContainerClass*m_containers[3];
....
m_containers[FA] = ...; // etc.

(Используя карты это намного более изящно, чтобы использовать: std::map<Folders, ContainerClass*> m_containers;)

Но возвратиться к моему оригинальному вопросу: Что такое, если я не хочу к твердому кодексу размера множества, там способ выяснить, сколько пунктов находится в Папках? (Не полагаясь, например. FC будучи последним пунктом в списке, который позволил бы что-то как ContainerClass*m_containers[FC+1] если я не ошибаюсь.)

91
задан Crast 20 January 2010 в 15:41
поделиться

3 ответа

Там не совсем хороший способ сделать это, обычно вы видите лишний предмет в Enum, то есть

enum foobar {foo, bar, baz, quz, FOOBAR_NR_ITEMS};

так что тогда вы можете сделать:

int fuz[FOOBAR_NR_ITEMS];

все еще не очень приятно хотя.

Но, конечно, вы понимаете, что только количество предметов в Enum не является безопасным, учитывая E.G.

enum foobar {foo, bar = 5, baz, quz = 20};

Количество элементов будет 4, но целочисленные значения значений Enum вытекают из диапазона индекса массива. Использование значений Enum для индексации массива не безопасна, вы должны рассмотреть другие варианты.

Отредактируйте: в соответствии с запросом сделано специальная запись ввода больше.

116
ответ дан 24 November 2019 в 06:48
поделиться

Добавьте запись, в конце вашего enum, называемые папками_макс или что-то подобное и используйте это значение при инициализации ваших массивов.

ContainerClass* m_containers[Folders_MAX];
3
ответ дан 24 November 2019 в 06:48
поделиться

для C ++, Доступны различные методы технологий типа безопасности типа , а некоторые из них (например, предлагаемые, но никогда не представлены Boost.enum ) включают поддержку для получения размера enum Отказ

Самый простой подход, который работает в C, а также C ++, состоит в том, чтобы принять соглашение об объявлении ... максимального значения для каждого из ваших типов Enum:

enum Folders { FA, FB, FC, Folders_MAX = FC };
ContainerClass *m_containers[Folders_MAX + 1];
....
m_containers[FA] = ...; // etc.

Редактирование : относительно {Fa , Fb, fc, folders_max = fc} против {fa, fb, fc, folders_max] : Я предпочитаю установить значение ... MAX Value на последнюю юридическую ценность Enum по нескольким причинам :

  1. имя константы технически более точнее (с папок_max дает максимально возможное значение enum).
  2. Лично, я чувствую, что Polders_max = Fc выделяется из других записей немного больше (что делает его немного сложнее, чтобы случайно добавить значения Enum без обновления максимального значения, проблема Martin york, ссылается).
  3. GCC включает в себя полезные предупреждения, такие как «значение перечисления, не включенное в переключатель» для такого кода, как следующее. Позволяя папки_Макс == Fc + 1 разбивает эти предупреждения, поскольку вы заканчиваете кучу ... максимальные значения перечисления, которые никогда не должны быть включены в переключатель.
switch (folder) 
{
  case FA: ...;
  case FB: ...;
  // Oops, forgot FC!
}
32
ответ дан 24 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: