C++ 在C+中使用多个三元运算符调用时,不会区分由bool和enum类型重载的函数+;
尝试使用条件运算符调用重载函数时遇到了一个有趣的问题(只是为了避免多个if-else条件)C++ 在C+中使用多个三元运算符调用时,不会区分由bool和enum类型重载的函数+;,c++,ternary-operator,overloading,C++,Ternary Operator,Overloading,尝试使用条件运算符调用重载函数时遇到了一个有趣的问题(只是为了避免多个if-else条件) 令人惊讶的是,如果我不使用三元运算符,而是使用多个if-else-if-else块,重载函数工作得很好。我很想了解原因。这是因为三元运算符总是计算为单一类型。不能使用此运算符“返回”不同的类型 当编译器遇到这样一个表达式时,他会试图弄清楚是否可以将整个过程简化为一种类型。如果这是不可能的,你会得到一个编译错误 在您的情况下,有一个有效的选项使用bool作为类型。因为cfg->dic是一种enum类型,可以
令人惊讶的是,如果我不使用三元运算符,而是使用多个if-else-if-else块,重载函数工作得很好。我很想了解原因。这是因为三元运算符总是计算为单一类型。不能使用此运算符“返回”不同的类型 当编译器遇到这样一个表达式时,他会试图弄清楚是否可以将整个过程简化为一种类型。如果这是不可能的,你会得到一个编译错误 在您的情况下,有一个有效的选项使用
bool
作为类型。因为cfg->dic
是一种enum
类型,可以隐式转换为bool
。如果您使用andenum类
,您的代码将不再编译,从而显示您的实际问题()
我也不知道这种代码的优点是什么。在我看来,这使得代码更难阅读。如果您担心的问题太多,您可以将ifs
减少为一个:
if(acc == VirtualGpio::Pin)
setCfgSetting(&cfg->pin,cfg->dic);
else
setCfgSetting(&cfg->pin, cfg->dic == VirtualGpio::INPUT);
我们可以忍受糟糕的英语(毕竟我的法语很糟糕),但是你对格式的不重视是应该受到谴责的。谢谢,塞巴斯蒂安,也许我需要更多的理解,表达式,setCfgSetting(&cfg->pin,((acc==VirtualGpio::pin)?cfg->dic:((cfg->dic==VirtualGpio::INPUT)?true:false)))==错误)最终结果为“1”或“0”,尽管cfg->dic=“0xC7”的值为,您是说在类型转换后,枚举值0xC7将作为布尔值结束为“1”或“0”吗"?. 此外,我假设整个表达式仅对第一个三元运算符的右侧求值,即使我强制使第一个条件运算符的左侧为true
main()
{
static struct VirtualGpio::pinconfig cfg = {
.pin = {
.location = VirtualGpio::GPIO_ON_GPIOEXP1_TCI,
.pinno = 0,
.portno = -1
},
.plrty = VirtualGpio::active_high,
.IsPullupCfgValid = true,
.IsTriStCfgValid = true,
.IsInputFilterValid = true,
.dic = VirtualGpio::OUTPUT,
.fptr = NULL
};
factory fac;
fac.GetGpiofactory(&cfg);
}
if(acc == VirtualGpio::Pin)
setCfgSetting(&cfg->pin,cfg->dic);
else
setCfgSetting(&cfg->pin, cfg->dic == VirtualGpio::INPUT);