如何|=
在强类型(作用域)enum
(在 C++11、GCC 中)上重载运算符?
我想在强类型枚举上测试、设置和清除位。为什么要强类型?因为我的书说这是很好的做法。但这意味着我必须static_cast<int>
无处不在。为了防止这种情况,我重载了|
and&
运算符,但我不知道如何在 enum 上|=
重载运算符。对于一个类,您只需将运算符定义放在 class中,但对于在语法上似乎不起作用的枚举。
这是我到目前为止所拥有的:
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++ 枚举的工作方式完全相同。在这两种语言中,强制转换都需要从 enum 到 int,反之亦然。但是,在 C# 中,按位运算符默认是重载的,而在 C++ 中则不是。