c++ - 是否可以将作用域枚举 ("enum class") 上下文转换为 bool 值?

标签 c++ enums enum-class

假设我有

enum class Flags : std::uint16_t
{
    None = 0,
    A    = 0x0001,
    B    = 0x0002,
    C    = 0x0004
}

inline Flags operator|(Flags lhs, Flags rhs)
{
    return static_cast<Flags>(static_cast<std::uint16_t>(lhs) | static_cast<std::uint16_t>(rhs));
}

inline Flags operator&(Flags lhs, Flags rhs)
{
    return static_cast<Flags>(static_cast<std::uint16_t>(lhs) & static_cast<std::uint16_t>(rhs));
}

inline Flags operator|=(Flags& lhs, Flags rhs)
{
    return lhs = lhs | rhs;
}

inline Flags operator&=(Flags& lhs, Flags rhs)
{
    return lhs = lhs & rhs;
}

是否有可能使枚举类在上下文中可转换为 bool 以允许某人做

Flags f = /* ... */;
if (f & Flags::A) {
    // Do A things
}

最佳答案

我认为您不能为 bool 提供转换运算符,因为没有该类的真实实例,但您可以重载其他运算符。最自然的是 operator!:

bool operator!(Flags f) {
   return f == Flags::None;
}

然后你的程序会做:

if (!!(f & Flags::A)) {

这确实不自然,但对其他人来说并不可怕(至于这意味着什么,他们可能会对双重否定感到困惑)。

或者,您可以将操作实现为命名函数以使其更具可读性:

bool test(Flag f, Flag mask) {
   return !!(f & mask);
}
if (test(f,Flags::A)) { …

话又说回来,如果你真的想要隐式转换,你为什么首先使用枚举类?

关于c++ - 是否可以将作用域枚举 ("enum class") 上下文转换为 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297992/

相关文章:

c++ - 如何在设定的时间段内使用计时器

c++ - Scoped Enums(枚举类)关系运算符

c++ - 通过引用或值枚举类 C++11

c++ - 为每个打开的应用程序截屏

c++ - 防止 bool 中的隐式对象构造?

c++枚举类未正确显示

python - 在Python中使用枚举来检查类/实例的属性

java - Java 编译器是否删除了检查枚举常量的无法访问的 if 语句?

c++ - 定义枚举后赋值

C++ - 分配一个无符号字符缓冲区,然后用一个字符串填充它