簡體   English   中英

C++ 將邏輯運算符 function 分配給變量

[英]C++ assign a logical operator function to a variable

我正在嘗試將邏輯運算符 function 分配給變量,但無法使其正常工作。 我在用:

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 使用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>()是否可以作為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>();

但是等等,除了1之外的std::function開銷,具體取決於代碼的 rest 的樣子,顯示的片段可能會簡化為:

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 字節的 memory 和一兩個額外的間接。 將生成的版本代碼與 std::function沒有 std::function 的版本進行比較

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM