c++ - 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。
我错过了什么?
谢谢
解决方案
短版:
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
的构造函数执行的检查只是是否less<bool>()
可以调用 as bool(double, double)
,是的,它可以!double
可隐式转换为bool
、0.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 的版本进行比较。
推荐阅读
- amazon-web-services - 将 AWS Glue 作业迁移到 EC2
- angular - 角。使用 @viewchild 将 templateRef 与服务一起传递
- angularjs - Angular 从 HTML 中的 DIV 类生成 PDF 文档
- java - 从准备但未发送的 android 应用程序发送彩信
- opencart - “Opencart > 销售 > 订单”多个“打印发票”或“打印发货清单”不起作用
- php - 如何从 Laravel 中的数据透视表中删除行?
- tfs - 如何为解决方案选择添加变量
- python - 在python中删除重复的对象列表
- android - java.io.UnsupportedEncodingException: java.nio.charset.CharsetICU[UTF-8]
- python - 玩家卡在墙pygame中