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

标签 c++ c++11 enums operator-overloading bitwise-operators

如何使 |= 过载强类型(作用域)上的运算符 enum (在 C++11、GCC 中)?

我想测试、设置和清除强类型枚举的位。为什么要强类型?因为我的书说这是很好的做法。但这意味着我必须 static_cast<int>到处。为了防止这种情况,我重载了 |&运算符,但我不知道如何重载 |=运算符枚举。对于类(class),您只需输入 the operator definition in the 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++ 中则不是。

最佳答案

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

这行得通吗? Compile and run: (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.

关于c++ - 如何在作用域枚举上重载 |= 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889414/

相关文章:

c++ - 是否需要删除渲染上下文并销毁设备上下文?

c++ - 删除元素时使用 STL 映射的迭代器时遇到问题

C++二进制输出问题

objective-c - 是否有一个 native 函数可以检查某个值是否在枚举内部?

c++ - 如何将 C++ 宏转换为更优雅的解决方案

c++ - 重构使用 if 语句的重复范围检查

c++ - 迭代器和简单的赋值/析构函数

c++ - 如何像普通 C 函数一样使用正确的 'this' 指针调用 C++ 类成员函数? (指向类成员函数的指针)

c++ - 字符串枚举的等价物

swift - 将不可失败的初始化器委托(delegate)给可失败的初始化器