C ++ назначает функцию логического оператора переменной - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь назначить функцию логического оператора переменной, но не могу заставить ее работать. Я использую:

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.

Чего мне не хватает?

Спасибо

1 Ответ

2 голосов
/ 23 апреля 2020

Короткая версия :

less<bool> сравнение bool с. Используйте less<double> для сравнения double с (также в 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 неявно преобразуется в bool, 0.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 . . .
}

1 std::function стоит около 48-96 байт памяти и дополнительные косвенные или два. Сравните сгенерированный код для версии с std :: function против версии без std :: function .

...