您可以对枚举类使用按位运算符而不进行强制转换吗?

问题描述

我喜欢使用枚举类,但是有时我将它们用作标志,并且如果要使用按位运算符,则必须不断地强制转换为int。有没有一种方法可以不铸造?我认为您不能为它们定义运算符吗?

如果我有采用枚举类的函数,我是否必须这样做?

enum class Flags { FLAG1,FLAG2,FLAG3};

void setFlags(Flags flags){}

int main()
{
      setFlags((Flags)((int)Flags::FLAG1 | (int)Flags::FLAG2 | (int)Flags::FLAG3));
}

解决方法

如果您不想自己在作用域枚举上重载运算符,为什么不使用其中一个为您执行此操作的库。

例如:

我自己创建了这样的库-bitflags(不是最好的库,但是可以满足我的要求),您只需指定以下内容即可创建标志:

BEGIN_BITFLAGS(Flags)
    FLAG(none)
    FLAG(flag_a)
    FLAG(flag_b)
    FLAG(flag_c)
END_BITFLAGS(Flags)

然后您可以这样做:

int main() {
    Flags flags = Flags::flag_a | Flags::flag_b;

    if (flags & Flags::flag_a) {
        std::cout << "flag_a is set" << std::endl;
    } else {
        std::cout << "flag_a is not set" << std::endl;
    }

    flags.toggle(Flags::flag_a);

    // ...

    return 0;
}

请注意,由于最小尺寸类型是自动使用的,因此不需要指定标志的类型,此外,您无需指定标志的值。它们也会自动分配。

,

class之后的enum指定枚举是强类型的,并且其枚举器是作用域的。注意,enum class仅在默认情况下定义了赋值,初始化和比较。不过,枚举是用户定义的类型,因此,您可以为其定义运算符。


如果您不想显式限定枚举器名称,并且希望枚举器值为ints(无需显式转换),则可以从class中删除enum class得到“普通” enum。枚举器被导出到周围的范围以避免名称冲突,您可以使用名称空间进行包装。

#include <iostream>

namespace Flags {
    enum : int 
    {
        bit_1 = 0x1,bit_2 = 0x2
    };
}

int main()
{
    int num = 11;
    if (num & Flags::bit_1)
        std::cout << "lsb is on!\n";
    else 
        std::cout << "lsb is off!\n";
    return 0;
}

参考

  • Bjarne Stroustrup的C ++第二版导览

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...