隐式转换运算符函数从 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 来提供从 boolCommand 的显式转换。我一直无法找到这个语法。我目前最好的猜测是:

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 的全部目的是防止直接与 intbool 具有隐式转换)进行比较。因此,只要您使用的是 enum class,就没有简单的方法可以隐式执行此操作。

也就是说,您可以利用 Off 是枚举的第一项(它将转换为 int 0)而 On 是第二项(这将转换为 1)。由于这匹配 boolint 的隐式 falsetrue 转换,您可以执行以下操作:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...