Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法在C++;?_C++_Size_Enums - Fatal编程技术网

C++ 有没有办法在C++;?

C++ 有没有办法在C++;?,c++,size,enums,C++,Size,Enums,可以编写一个返回枚举中元素数的函数吗?例如,假设我定义了: enum E {x, y, z}; 那么f(E)将返回3。否 如果有,您就不会看到这么多这样的代码: enum E { VALUE_BLAH, VALUE_OTHERBLAH, ... VALUE_FINALBLAH, VALUE_COUNT } 请注意,这段代码也是一个(令人讨厌的)解决方案的提示——如果您添加了最后一个“guard”元素,并且没有显式地声明枚举字段的值,那么最后一个“COUNT”元素将具有您要

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

enum E {x, y, z};
那么f(E)将返回3。

如果有,您就不会看到这么多这样的代码:

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
}

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

不,这是一个VFAQ,答案是否定的

不管怎么说,不是没有偷懒

即使是最后一个条目的技巧也只有在所有值都不是默认值的情况下才有效。例如:

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_); }
#包括
#包括
#定义新枚举(类型、值)\
typedef枚举{BOOST_PP_SEQ_enum(Values)}Type\
大小计数(类型){return BOOST\u PP\u SEQ\u大小(值)}

请注意,长度也可以是模板专门化或任何内容。我不知道你的情况,但我真的很喜欢BOOST中“序列”的表现力

谢谢,这似乎是我将要提出的一个很好的解决方案。这当然只适用于连续枚举。如果你曾经在错误代码列表中遇到过类似的“漏洞”,那你就完蛋了。我发布了一个简单的宏来解决这个问题并处理“漏洞”问题。谢谢。很抱歉重复了一个VFAQ-我在这里和更大的网站上都搜索过,但找不到这个问题的任何实例。没问题。我自己已经搜索了足够多的时间,知道大师说“该隐不可当”+1,因为它是有效的。虽然我不确定我是否喜欢声明语法,但是有一些结构可供选择(数组、列表、序列和元组),我可以使用元组来定义新的枚举(MyEnum,(Val1,Val2,Val3=6))。这仅仅是对宏有用性的证明:)