如何在作用域枚举上重载 \|= 运算符?

新手上路,请多包涵

如何在强类型(作用域) enum (在 C++11,GCC 中)上重载 |= 运算符

我想在强类型枚举上测试、设置和清除位。为什么要强类型?因为我的书说这是很好的做法。但这意味着我必须 static_cast<int> 无处不在。为了防止这种情况,我重载了 |& 运算符,但我不知道如何 在 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++ 中则不是。

原文由 Daniel A.A. Pelsmaeker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 420
1 个回答
inline NumericType& operator |=(NumericType& a, NumericType b)
{
    return a= a |b;
}

这行得通吗? 编译运行:(Ideone)

 #include <iostream>
using namespace std;

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));
}

inline NumericType& operator |=(NumericType& a, NumericType b)
{
    return a= a |b;
}

int main() {
    // your code goes here
    NumericType a=NumericType::PadWithZero;
    a|=NumericType::NegativeSign;
    cout << static_cast<int>(a) ;
    return 0;
}

打印 3。

原文由 qPCR4vir 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题