Bil*_*eal 6 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;
}
Run Code Online (Sandbox Code Playgroud)
是否有可能使枚举类在上下文中可转换为bool以允许某人执行
Flags f = /* ... */;
if (f & Flags::A) {
// Do A things
}
Run Code Online (Sandbox Code Playgroud)
我不认为你可以提供转换运算符bool,因为没有类的实际实例,但你可以重载其他运算符.自然会是operator!:
bool operator!(Flags f) {
return f == Flags::None;
}
Run Code Online (Sandbox Code Playgroud)
然后你的程序会做:
if (!!(f & Flags::A)) {
Run Code Online (Sandbox Code Playgroud)
这真的不自然,但对其他人来说并不会令人惊讶(因为它意味着,他们可能会被双重否定所迷惑).
或者,您可以将操作实现为命名函数,以使其更具可读性:
bool test(Flag f, Flag mask) {
return !!(f & mask);
}
if (test(f,Flags::A)) { …
Run Code Online (Sandbox Code Playgroud)
然后,如果你真的想要隐式转换,为什么你首先使用枚举类?
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |