有没有办法在C ++中找到枚举的基数(大小)?

时间:2010-02-02 04:40:43

标签: c++ size enums

是否可以编写一个返回枚举中元素数量的函数?例如,假设我已定义:

enum E {x, y, z};

然后f(E)将返回3.

4 个答案:

答案 0 :(得分:18)

不。

如果有,你就不会看到这么多代码:

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

请注意,此代码也是一个(讨厌的)解决方案的提示 - 如果添加最终的“guard”元素,并且没有明确说明枚举字段的值,那么最后一个“COUNT”元素将拥有你正在寻找的价值 - 这是因为枚举数从零开始:

enum  B {
  ONE,   // has value = 0
  TWO,   // has value = 1
  THREE, // has value = 2
  COUNT  // has value = 3 - cardinality of enum without COUNT
}

答案 1 :(得分:4)

有方法,但你必须工作......有点:)

基本上你可以用宏来获得它。

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中“序列”的表现力;)

答案 2 :(得分:3)

不,这是VFAQ,答案是否定的!!

无论如何都不是没有克服。

即使关于最终条目的那个技巧也只有在没有值是非默认值的情况下才有效。例如,

enum  B {
         ONE,   // has value = 0
         TWO,   // has value = 1
         THREE=8, // because I don't like threes
         COUNT  // has value = 9 
        }

答案 3 :(得分:2)

没有。首先,您不能将类型作为参数(只是类型的实例)