首页 > 解决方案 > 您可以在不强制转换的情况下将位运算符与枚举类一起使用吗?

问题描述

int我喜欢使用枚举类,但有时我将它们用作标志,如果我想使用按位运算符,我必须不断地转换为。有没有办法做到这一点而不铸造?我不认为你可以为他们定义运营商?

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

enum class Flags { FLAG1, FLAG2, FLAG3};

void setFlags(Flags flags){}

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

标签: c++enum-class

解决方案


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

例如:

我自己创建了这样的库 - 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;
}

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


推荐阅读