我正在尝试将逻辑运算符函数分配给变量,但无法使其工作。我正在使用:
function<bool(double,double)> opFunct = less<bool>();
double highorlow = pOut.high;
if(pCheck){
opFunct = greater<bool>();
highorlow = pOut.low;
}
if(opFunct(highorlow,pStay.middle){
//never gets done
}
这段代码的问题是,无论 high 或 low,pStay.middle double 是什么,它都会返回 false。
我错过了什么?
谢谢
最佳答案
简短版本:
less<bool>
比较 bool
s。使用less<double>
比较double
s(也在 greater<>
中)。
长版:
这是一个有趣的问题。具体来说,以下行是如何编译的?
function<bool(double, double)> opFunct = less<bool>();
毕竟 std::less<bool>
:: operator()
看起来像 bool(bool, bool)
,为什么它匹配 bool(double, double)
?
那是因为检查 std::function
's constructor执行只是是否 less<bool>()
可以被调用为bool(double, double)
,是的,可以! double
可隐式转换为 bool
, 0.0
变成false
和任何其他值 true
.
这显然不会产生预期的结果,因为例如opFunct(1.0, 2.0)
将调用less(true, true)
这将返回 false
.
修复方法是更改 bool
至double
function<bool(double, double)> opFunct = less<double>();
还有这里
opFunct = greater<double>();
但是等等,std::function
撇开开销1,根据其余代码的外观,显示的片段可能会简化为:
if (pCheck ? pStay.middle < pOut.low : pOut.high < pStay.middle) {
// . . .
}
或者甚至
if (pStay.middle < pOut.low || pOut.high < pStay.middle) {
// both checks at once . . .
}
1 std::function
其代价是大约 48-96 字节的内存和一个或两个额外的间接寻址。比较生成的代码 version with std::function与 version without std::function .
关于C++ 将逻辑运算符函数分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61395864/