【问题标题】:Any benefits to declare an enum class underlying type bool?声明一个枚举类底层类型 bool 有什么好处?
【发布时间】:2021-09-20 02:20:45
【问题描述】:

在我目前正在开发的库中,有这个小东西:

enum class BoolMode : uint8_t
{
    TrueIfFalse = 0,
    TrueIfTrue  = 1
};

这是一个小助手,用于轻松生成可逆条件检查,同时只需创建一个易于编写和阅读的单一实现...

为了让这个帮助器易于使用,我必须为bool 定义比较运算符(显然)。我是这样做的:

inline constexpr bool operator ==(const bool boolValue, const BoolMode mode) noexcept
{
    return (boolValue == static_cast<const bool>(mode));
}

inline constexpr bool operator !=(const bool boolValue, const BoolMode mode) noexcept
{
    return (boolValue != static_cast<const bool>(mode));
}

inline constexpr bool operator ==(const BoolMode mode, const bool boolValue) noexcept
{
    return (boolValue == static_cast<const bool>(mode));
}

inline constexpr bool operator !=(const BoolMode mode, const bool boolValue) noexcept
{
    return (boolValue != static_cast<const bool>(mode));
}

我想知道这样定义BoolMode 是否有任何好处

enum class BoolMode : bool
{
    TrueIfFalse = false,
    TrueIfTrue  = true
};

由于无论如何都必须努力来定义比较运算符,所以我看不出最好的选择是什么......

问题:

  • 使用bool作为底层类型的目的是什么?
  • 有具体的使用例子吗?
  • 这段代码中有什么我应该注意的吗?
  • 有任何改进代码的线索和/或建议吗?

提前致谢。

【问题讨论】:

    标签: c++ enums underlyingtype


    【解决方案1】:

    如果boolX 的基础类型,那么std::underlying_type_t&lt;X&gt;bool

    boolenums 类型的变量与 bool 基础类型只有两个有效状态; 01

    uint8_tenums 类型的变量以及 uint8_t 基础类型有 256 个有效状态; 0255

    编译器和元编程都可以意识到这种差异。自定义notstd::optional 可以使用3 不是有效bool 的事实来使notstd::optional&lt;bool&gt; 占用一个字节(对于false,其值为0,对于true,其值为13nullopt)。

    这也可用于在序列化时将bools 或enums 与bool 基础类型智能打包到位字段中。

    理论上,当bool 是基础类型时,为== 生成的程序集可以进行位比较,而不是零或非零字节检查。我可以想象速度更快的平台。同时,如果 uint8_t 是基础类型,则枚举中的非零值 anywhere 意味着它在转换为 bool 时映射到 true

    这些问题都不太可能发生。

    【讨论】:

    • 简短、清晰,所有 true。谢谢 ! +1 和验证... ;) – 我没有考虑序列化 (尽管这个特殊的 enum 几乎没有机会被序列化)。我确实知道可能的asm 优化(thx)。要使最后一点为真,需要对未由枚举定义的值进行显式转换(这意味着它本来是“故意”完成的),但这是为了如果不需要的话,当然最好不要允许这样的事情......
    猜你喜欢
    • 2010-11-10
    • 2010-12-28
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2014-08-02
    • 2022-01-23
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多