是否可以将作用域枚举(“枚举类”)根据上下文转换为布尔值?

2024-04-26

假设我有

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)) { …

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将作用域枚举(“枚举类”)根据上下文转换为布尔值? 的相关文章

随机推荐