Можно было записать функцию, которая возвращает число элементов в перечислении? Например, скажите, что я определил:
enum E {x, y, z};
Затем f (E) возвратился бы 3.
Нет.
Если бы это было так, вы бы не увидели такого количества кода:
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
}
Нет, это 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
}
Есть способы, но вы должны работать... немного :)
В основном, вы можете получить его с помощью макроса.
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 ;)
.- Нет. Во-первых, в качестве параметров нельзя принимать типы (только экземпляры типов)
.