如何在强类型(作用域)enum
上重载|=
运算符(在C++11,GCC中)?
我想对强类型枚举测试、设置和清除位。为什么要使用强类型?因为我的书说这是个好习惯。但这意味着我必须在各处进行static_cast<int>
转换。为了避免这种情况,我重载了|
和&
运算符,但我无法弄清楚如何在枚举类型上重载|=
运算符。对于类而言,您只需将运算符定义放在类中,但在枚举类型中,这似乎在语法上行不通。
这是我目前的代码:
enum class NumericType
{
None = 0,
PadWithZero = 0x01,
NegativeSign = 0x02,
PositiveSign = 0x04,
SpacePrefix = 0x08
};
inline NumericType operator |(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) | static_cast<int>(b));
}
inline NumericType operator &(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) & static_cast<int>(b));
}
我这样做的原因是:在强类型的C#中,枚举只是一个具有其基础类型字段和一堆在其中定义的常量的结构体。但它可以具有适合于枚举的隐藏字段的任何整数值。
而且似乎C++的枚举也以完全相同的方式工作。在两种语言中,从枚举到int或反之需要进行强制转换。然而,在C#中,默认情况下重载了按位运算符,而在C++中没有。
PadWithZero | NegativeSign = 0x03
不是一个有效的枚举常量。 - Useless|
运算时不是封闭的,因此将其强制转换为该类型的(非法值)是没有意义的。枚举标志常量值,但将多个标志组合成一个整数。 - Useless0x03
为什么是非法的?虽然它不属于列出的类型之一,但我不知道是否有限制enum class
中存储0x03
的未定义行为... - Yakk - Adam Nevraumont