微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我喜欢使用枚举类,但是有时我将它们用作标志,并且如果要使用按位运算符,则必须不断地强制转换为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 ++第二版导览

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。