C++ 从bool到enum类的隐式转换运算符函数
我有一个函数,用于更改LED的状态,该LED接收具有三个可能值的枚举参数: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到命令的显式转换。我找不到这个的语法。我目前的最佳猜测是
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
是枚举的第一项(它将转换为int0
),而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
是枚举的第一项(它将转换为int0
),而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)
?对我来说,感觉更短更容易阅读。