C++ 从bool到enum类的隐式转换运算符函数

C++ 从bool到enum类的隐式转换运算符函数,c++,operator-keyword,enum-class,C++,Operator Keyword,Enum Class,我有一个函数,用于更改LED的状态,该LED接收具有三个可能值的枚举参数: enum class Command { Off, On, Toggle }; void led(Command); 我希望能够将led()函数与bool参数一起使用:led(true)或led(false) 我意识到我可以用void-led(bool)重载void-led(命令)功能,但我觉得这不必要 具体地说,我认为我应该能够定义一个操作符,它提供从bool到命令的显式转换。我找不到这个的语法。我目前的最佳猜测是

我有一个函数,用于更改LED的状态,该LED接收具有三个可能值的枚举参数:

enum class Command { Off, On, Toggle };

void led(Command);
我希望能够将
led()
函数与
bool
参数一起使用:
led(true)
led(false)

我意识到我可以用
void-led(bool)
重载
void-led(命令)
功能,但我觉得这不必要

具体地说,我认为我应该能够定义一个
操作符
,它提供从
bool
命令的显式转换。我找不到这个的语法。我目前的最佳猜测是:

inline constexpr operator Command(bool on) { return on ? Command::On : Command::Off; }
但是
操作符
重载似乎只能在类内声明?我可以看到如何用一个完整的类而不是
enum类
来实现这一点,但这在这里似乎很沉重


我想做的是可能的吗?

我认为函数重载正是为了这个需要而设计的:相同的操作,不同的输入类型。不过我还是要更改方法名称,通常动词会使操作更清晰,并提高代码的可读性

比如:

void set_led(Command);
void set_led(bool on){
    if(on)
        return set_led(On);
    return set_led(Off);
}

我认为函数重载正是为了这种需要而设计的:相同的操作,不同的输入类型。不过我还是要更改方法名称,通常动词会使操作更清晰,并提高代码的可读性

比如:

void set_led(Command);
void set_led(bool on){
    if(on)
        return set_led(On);
    return set_led(Off);
}

您使用的
enum类
的全部目的是防止直接与
int
进行比较(后者
bool
具有到的隐式转换)。因此,只要您使用的是
enum类
,就没有简单的隐式实现方法

这就是说,您可以利用这样一个事实:您的
Off
是枚举的第一项(它将转换为int
0
),而
On
是第二项(它将转换为
1
)。由于这与
false
true
的隐式
bool
int
转换相匹配,因此可以执行以下操作:

led(Command(true));
led(Command(false));
在行动中看到它:


或者,您可以只切换到
枚举
而不是
枚举类
,这将允许您的
命令
隐式转换为
int
。由于
bool
还有一个到
int
的隐式转换,因此您可以将
led()
方法更改为获取
int
,然后直接使用以下命令调用它:

led(true);
led(false);

查看它的作用:

您使用的
enum类
的全部目的是防止直接与
int
进行比较(后者
bool
具有到的隐式转换)。因此,只要您使用的是
enum类
,就没有简单的隐式实现方法

这就是说,您可以利用这样一个事实:您的
Off
是枚举的第一项(它将转换为int
0
),而
On
是第二项(它将转换为
1
)。由于这与
false
true
的隐式
bool
int
转换相匹配,因此可以执行以下操作:

led(Command(true));
led(Command(false));
在行动中看到它:


或者,您可以只切换到
枚举
而不是
枚举类
,这将允许您的
命令
隐式转换为
int
。由于
bool
还有一个到
int
的隐式转换,因此您可以将
led()
方法更改为获取
int
,然后直接使用以下命令调用它:

led(true);
led(false);

查看它的实际操作:

这是函数重载的典型用例,我怀疑是否有比
void-led(bool)
enum-class
做的这么多更好的解决方案。如果您希望它有行为,您可能希望使用
类命令{public:enum Op{Off,On,Toggle};/*…*/}然后你可以添加成员函数、转换构造函数、
显式运算符bool
,等等。这是函数重载的典型用例,我怀疑有比
void led(bool)
enum class
更好的解决方案。如果您希望它有行为,您可能希望使用
类命令{public:enum Op{Off,On,Toggle};/*…*/}然后在成员函数、转换构造函数、代码>显式操作符布尔O/COD>等等中添加一个地方。好,你不会<代码>返回< /CUD>调用空虚函数的结果,但否则是。@弥敦在C++()中是完全合法的。Mat这样做只是为了让他们不需要
else
语句或
return
的单独一行。哈,我不知道!整洁。@Nathan Ehm,我也不知道,这是长颈鹿船长的密码!:-)因为他比我有好几个数量级的声誉,我没有什么可抱怨的。有没有理由不使用set_-led(on?Command::on:Command::Off)
?对我来说,感觉更短更容易阅读。嗯,你不会<代码>返回< /CUD>调用空虚函数的结果,但其他的是。@弥敦在C++中是完全合法的。Mat这样做只是为了让他们不需要
else
语句或
return
的单独一行。哈,我不知道!整洁。@Nathan Ehm,我也不知道,这是长颈鹿船长的密码!:-)因为他比我有好几个数量级的声誉,我没有什么可抱怨的。有没有理由不使用set_-led(on?Command::on:Command::Off)
?对我来说,感觉更短更容易阅读。