首页 > 解决方案 > C ++将逻辑运算符函数分配给变量

问题描述

我正在尝试将逻辑运算符函数分配给变量,但无法使其工作。我在用:

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
}

这段代码的问题是无论 highorlow,pStay.middle 双打是什么,它都会返回 false。

我错过了什么?

谢谢

标签: c++functionvariableslogical-operators

解决方案


短版

less<bool>比较bools。用于less<double>比较doubles(也在 中greater<>)。

长版

这是个有趣的问题。具体来说,以下行是如何编译的?

function<bool(double, double)> opFunct = less<bool>();

毕竟看起来,为什么会匹配?std::less<bool>:: operator()bool(bool, bool)bool(double, double)

那是因为std::function的构造函数执行的检查只是是否less<bool>()可以调用 as bool(double, double),是的,它可以!double可隐式转换为bool0.0变为false和任何其他值true

这显然不会产生预期的结果,因为例如opFunct(1.0, 2.0)将调用less(true, true)which 将返回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 . . .
}

1std::function的代价是大约 48-96 字节的内存和一两个额外的间接寻址。将生成的带有 std::function的版本代码与带 std::function 的版本进行比较。


推荐阅读