C++ 将逻辑运算符函数分配给变量

标签 c++ function variables logical-operators

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

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 .

修复方法是更改​​ booldouble

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::functionversion without std::function .

关于C++ 将逻辑运算符函数分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61395864/

相关文章:

function - golang中固定cos数学函数有没有解决办法

C# 语法 : where TResponse, new()

python - 为什么内部函数不能在python的外部范围内获取变量

C++静态变量动态

c++ - Windows和Linux之间的相对路径分辨率差异?

c++ - Qt::QueuedConnection 信号是否总是按顺序调用?

c++ - 初始化 vector 的高效而优雅的方法

c++ - 如何避免在 Visual Studio 中调试到 Boost 源代码?

function - Haskell 的foldr 函数有多少个参数?

swift - 如何在 SKScene 中使用另一个变量初始化一个变量