声明枚举 class 基础类型 bool 有什么好处?
Any benefits to declare an enum class underlying type bool?
在我目前正在开发的库中,我有这个小东西:
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
作为基础类型的目的是什么?
- 有具体的使用实例吗?
- 这段代码中有什么我应该注意的吗?
- 任何线索 and/or 改进代码的建议?
提前致谢。
如果 bool
是 X
的基础类型,那么 std::underlying_type_t<X>
就是 bool
。
bool
和 enum
类型的 bool
基础类型的变量只有两个有效状态; 0
和 1
.
uint8_t
和 enum
类型的 uint8_t
类型的变量有 256 个有效状态; 0
到 255
.
编译器和元编程都可以意识到这种差异。自定义 notstd::optional
可以使用 3
不是有效 bool
的事实来使 notstd::optional<bool>
占用一个字节(它的值将为 0
false
、1
用于 true
和 3
用于 nullopt
)。
这也可用于在序列化时将具有 bool
基础类型的 bool
或 enum
智能打包到位字段中。
理论上,当 bool
是基础类型时,为 ==
生成的程序集可以进行位比较而不是零或非零字节检查。我可以想象更快的平台。同时,如果 uint8_t
是基础类型,则枚举中的非零值 anywhere 意味着它在转换为 bool
时映射到 true
。
None 这些问题的可能性很大。
在我目前正在开发的库中,我有这个小东西:
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
作为基础类型的目的是什么? - 有具体的使用实例吗?
- 这段代码中有什么我应该注意的吗?
- 任何线索 and/or 改进代码的建议?
提前致谢。
如果 bool
是 X
的基础类型,那么 std::underlying_type_t<X>
就是 bool
。
bool
和 enum
类型的 bool
基础类型的变量只有两个有效状态; 0
和 1
.
uint8_t
和 enum
类型的 uint8_t
类型的变量有 256 个有效状态; 0
到 255
.
编译器和元编程都可以意识到这种差异。自定义 notstd::optional
可以使用 3
不是有效 bool
的事实来使 notstd::optional<bool>
占用一个字节(它的值将为 0
false
、1
用于 true
和 3
用于 nullopt
)。
这也可用于在序列化时将具有 bool
基础类型的 bool
或 enum
智能打包到位字段中。
理论上,当 bool
是基础类型时,为 ==
生成的程序集可以进行位比较而不是零或非零字节检查。我可以想象更快的平台。同时,如果 uint8_t
是基础类型,则枚举中的非零值 anywhere 意味着它在转换为 bool
时映射到 true
。
None 这些问题的可能性很大。