如何解决隐式转换运算符函数从 bool 到 enum class
我有一个函数来改变 LED 的状态,该函数接受一个具有三个可能值的枚举参数:
enum class Command { Off,On,Toggle };
void led(Command);
我希望能够使用带有 led()
参数的 bool
函数:led(true)
或 led(false)
。
我意识到我可以用 void led(Command)
重载 void led(bool)
函数,但我觉得这没有必要。
具体来说,我认为我应该能够定义一个 operator
来提供从 bool
到 Command
的显式转换。我一直无法找到这个语法。我目前最好的猜测是:
inline constexpr operator Command(bool on) { return on ? Command::On : Command::Off; }
但似乎 operator
重载只能在类中声明?我可以看到如何使用完整的类而不是 enum class
来做到这一点,但这在这里似乎很重。
我想做的事情可行吗?
解决方法
我认为函数重载正是为了这个需要而设计的:相同的动作,不同的输入类型。不过我会更改方法名称,通常动词会使动作更清晰并提高代码可读性。
类似于:
void set_led(Command);
void set_led(bool on){
if(on)
return set_led(On);
return set_led(Off);
}
,
您使用的 enum class
的全部目的是防止直接与 int
(bool
具有隐式转换)进行比较。因此,只要您使用的是 enum class
,就没有简单的方法可以隐式执行此操作。
也就是说,您可以利用 Off
是枚举的第一项(它将转换为 int 0
)而 On
是第二项(这将转换为 1
)。由于这匹配 bool
和 int
的隐式 false
到 true
转换,您可以执行以下操作:
led(Command(true));
led(Command(false));
查看实际操作:https://ideone.com/iWrc3s
或者,您可以只切换到 enum
而不是 enum class
,这将允许您的 Command
隐式转换为 int
。由于 bool
也有到 int
的隐式转换,您可以将 led()
方法更改为采用 int
,然后直接使用:
led(true);
led(false);
查看实际操作:https://ideone.com/HF0cxI
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。