这是我需要做的事情:在一个类内定义两个枚举,第二个枚举使用第一个枚举的元素值进行定义。
大概就像这样:
class MyClass
{
public:
enum class Elem {
A=1, B=2, C=4, D=8
};
enum class Group {
first = Elem::A | Elem::B,
second = Elem::A | Elem::C,
//...
}; <-- compilation error
};
然而,由于默认情况下枚举类型中未定义 | 运算符,因此无法编译。
我试图在 MyClass 类体外(类体后)为 Elem 枚举定义 | 运算符,但是在定义 Group 枚举时运算符是不可知的。
因此,我尝试了以下方法,即在类内部定义一个 constexpr 函数:
class MyClass
{
public:
enum class Elem {
A=1, B=2, C=4, D=8
};
constexpr static unsigned int merge(
std::initializer_list<MyClass::Elem> list)
{
//Test only: should be an '|' on all list elements
return 1;
}
enum class Group {
first = merge({Elem::A,Elem::B}),
second = merge({Elem::A,Elem::C}),
/*...*/
};
};
但我收到了以下错误:
错误:在常量表达式中调用 static constexpr unsigned int merge(std::initializer_list list)。
我从这里和那里了解到,只有在类被完全声明之后,merge
方法才被认为是已声明且可用的。
我能想到的最后一个解决方案是使用宏,像这样:
#define MERGE2ELEMS( a, b ) static_cast<unsigned int>(a) | static_cast<unsigned int>(b)
#define MERGE3ELEMS( a, b, c ) static_cast<unsigned int>(a) | MERGE2ELEMS( b, c )
#define MERGE4ELEMS( a, b, c, d ) static_cast<unsigned int>(a) | MERGE3ELEMS( b, c, d )
#define MERGE5ELEMS( a, b, c, d, e ) static_cast<unsigned int>(a) | MERGE4ELEMS( b, c, d, e )
...
但我需要能够合并多达20个 Elem
,编写20个类似这样的宏似乎并不是一个合适的解决方案。
在这种情况下,应该采取什么方法?
merge
方法一样的问题 :) - Silverspur