Существует ли способ найти кардинальность (размер) перечисления в C++?

Можно было записать функцию, которая возвращает число элементов в перечислении? Например, скажите, что я определил:

enum E {x, y, z};

Затем f (E) возвратился бы 3.

6
задан rofrankel 2 February 2010 в 04:40
поделиться

4 ответа

Нет.

Если бы это было так, вы бы не увидели такого количества кода:

enum E {
  VALUE_BLAH,
  VALUE_OTHERBLAH,
  ...
  VALUE_FINALBLAH,
  VALUE_COUNT
}

Обратите внимание, что этот код также является подсказкой для (неприятного) решения -- если вы добавите конечный элемент "защита" и не будете явно указывать значения полей переписей, то последний элемент "COUNT" будет иметь значение, которое вы ищете -- это происходит потому, что счетчик переписей основан на нулях:

enum  B {
  ONE,   // has value = 0
  TWO,   // has value = 1
  THREE, // has value = 2
  COUNT  // has value = 3 - cardinality of enum without COUNT
}
18
ответ дан 8 December 2019 в 03:53
поделиться

Нет, это VFAQ, и ответ нет !!

Не без Kludging в любом случае.

Даже этот трюк с окончательной записью работает только в том случае, если ни одно из ценностей не по умолчанию. E.G.,

enum  B {
         ONE,   // has value = 0
         TWO,   // has value = 1
         THREE=8, // because I don't like threes
         COUNT  // has value = 9 
        }
3
ответ дан 8 December 2019 в 03:53
поделиться

Есть способы, но вы должны работать... немного :)

В основном, вы можете получить его с помощью макроса.

DEFINE_NEW_ENUM(MyEnum, (Val1)(Val2)(Val3 = 6));

size_t s = count(MyEnum());

Как он работает?

#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/size.hpp>

#define DEFINE_NEW_ENUM(Type_, Values_)\
  typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\
  size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); }

Обратите внимание, что длина может быть также специализацией шаблона или чем угодно. Я не знаю как вы, но мне очень нравится выразительность "последовательности" в BOOST_PP ;)

.
4
ответ дан 8 December 2019 в 03:53
поделиться

- Нет. Во-первых, в качестве параметров нельзя принимать типы (только экземпляры типов)

.
2
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

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