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

Zeb*_*ish 7 c++ enum-class

int我喜欢使用枚举类,但有时我将它们用作标志,如果我想使用按位运算符,我必须不断地进行转换。有没有办法在不铸造的情况下做到这一点?我认为您无法为它们定义运算符?

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

enum class Flags { FLAG1, FLAG2, FLAG3};

void setFlags(Flags flags){}

int main()
{
      setFlags((Flags)((int)Flags::FLAG1 | (int)Flags::FLAG2 | (int)Flags::FLAG3));
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*ous 5

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


如果您不想显式限定枚举数名称并希望枚举数值ints(无需显式转换),则可以删除 fromclassenum class获得 "plain" 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;
}
Run Code Online (Sandbox Code Playgroud)

参考

  • Bjarne Stroustrup 的《C++ 之旅》第二版