如何在C++中重用枚举运算符重载?

Mic*_*ter 1 c++ enums operator-overloading

我在C++中有几个类似于旗帜的枚举.例如:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};
some_state var1;
Run Code Online (Sandbox Code Playgroud)

现在使用像&或的位运算符|,我得到编译器错误.我知道我可以超载operator |et.al. 对于枚举,但我讨厌为每一个枚举再次这样做.有没有一种很好的方法来重用运算符重载?

Pup*_*ppy 5

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};

int main() {
    some_state var1 = state_normal;
    some_state var2 = state_special;
    unsigned int var3 = var1 | var2;
}
Run Code Online (Sandbox Code Playgroud)

对我来说很好.你不能在没有重载的情况下使用|,&etc的原因是因为编译器不能保证var1 |的结果 var2是枚举中的有效值.如果要采用移位标志,则需要采用整数类型,而不是枚举类型.这在Direct3D等专业标题中一直使用.