【问题标题】:C++ assign a logical operator function to a variableC ++将逻辑运算符函数分配给变量
【发布时间】:2020-08-07 06:55:14
【问题描述】:

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

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 double 是什么,它都会返回 false。

我错过了什么?

谢谢

【问题讨论】:

  • 这看起来设计过度并且存在语法问题。std::function 不是轻量级对象。为什么不直接使用一对ifs?
  • 我正在从我的 python 项目中提取代码并尝试匹配。稍后会优化。只是更想知道以后如何做:)
  • less&lt;bool&gt;() 比较两个布尔值是否小于。你想要less&lt;double&gt;() 和类似的greater&lt;double&gt;()。错误行为是因为双精度数被转换为布尔值(0 为假,其他为真)。由于您的数字可能都是非零的,因此您正在比较 true 是否小于 true。

标签: c++ function variables logical-operators


【解决方案1】:

短版

less&lt;bool&gt; 比较 bools。使用less&lt;double&gt; 比较doubles(也在greater&lt;&gt; 中)。

加长版

这是一个有趣的问题。具体来说,下面这行是怎么编译的?

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

毕竟std::less&lt;bool&gt;:: operator()看起来像bool(bool, bool),为什么它匹配bool(double, double)

那是因为std::function's constructor 执行的检查仅仅是less&lt;bool&gt;() 是否可以作为bool(double, double) 调用,是的,它可以! double 可隐式转换为 bool0.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 . . .
}

1std::function 需要大约 48-96 字节的内存和一两个额外的间接寻址。比较version with std::functionversion without std::function 的生成代码。

【讨论】:

  • 没有没有警告.. 为什么会这样? std::function 构造函数的行为与指定的一样:...此构造函数不参与重载决议,除非 f 对于参数类型 Args... 和返回类型 R 是可调用的。
  • 只是想验证我的怀疑。完全损坏的代码没有警告。甚至有理由说明为什么在这里发出警告是不可能的(或“错误的”)。语言中的一个危险角落。
  • 感谢修复它。根据 Mat 的评论,与执行几个额外的 IF 语句相比,这真的是更多的开销吗?我虽然在速度方面算子函数等于算子?
  • 开销只是纳秒,在您的情况下可能无关紧要。有关更多详细信息,请参阅我的更新。
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2022-01-14
  • 2021-08-05
  • 2020-01-18
相关资源
最近更新 更多