我试图找到一种计算枚举长度的方法,而不是添加" COUNT"枚举结尾处的元素。我找到了一种使用预处理器的方法如下。
#include <iostream>
#include <boost/preprocessor/tuple/elem.hpp>
//simple declaration
template <class E>
struct enum_size;
//specialization is done in the macro for each enum created
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \
template <> \
struct enum_size<name> { \
static const int value = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__); \
};
MAKE_ENUM(my_enum1, a, b, c)
//MAKE_ENUM(my_enum2, a) //triggers compilation error
int main(int argc, char** argv) {
std::cout << enum_size<my_enum1>::value << std::endl;
}
但是,当我尝试按上述方法创建my_enum2
时,我从编译器(CygWin上的GCC 4.8.3)中得到重新声明错误,如下所示
main.cpp:16:21: error: redeclaration of 'a'
MAKE_ENUM(my_enum2, a)
^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \
^
main.cpp:15:21: note: previous declaration 'my_enum1 a'
MAKE_ENUM(my_enum1, a, b, c)
^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \
如果我将有问题的行更改为MAKE_ENUM(my_enum2, e)
,那么它会干净地编译。任何想法在这里有什么问题以及如何解决它?提前谢谢!
答案 0 :(得分:3)
变量a
已经输入my_enum1
,您无法重新声明它。您可以通过几种方式解决此问题
1)如果你有C ++ 11使用enum class
,而不是enum
。
#define MAKE_ENUM(name, ...) enum class name {__VA_ARGS__};
2)您可以将enum
放入namespace
。