Этот вопрос прибыл по моему мнению, когда у меня было что-то как
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]
если я не ошибаюсь.)
Там не совсем хороший способ сделать это, обычно вы видите лишний предмет в 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 для индексации массива не безопасна, вы должны рассмотреть другие варианты.
Отредактируйте: в соответствии с запросом сделано специальная запись ввода больше.
Добавьте запись, в конце вашего enum, называемые папками_макс или что-то подобное и используйте это значение при инициализации ваших массивов.
ContainerClass* m_containers[Folders_MAX];
для 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 по нескольким причинам :
папок_max
дает максимально возможное значение enum). Polders_max = Fc
выделяется из других записей немного больше (что делает его немного сложнее, чтобы случайно добавить значения Enum без обновления максимального значения, проблема Martin york, ссылается). switch (folder) { case FA: ...; case FB: ...; // Oops, forgot FC! }