Как передать в функцию лямбда выражение, если она захватывает внешние переменные

314
06 апреля 2021, 03:30

Есть такой код:

#include <iostream>
using namespace std;
bool f(double f_(int), int k) {
    if (f_(k) < 1) {
        return 0;
    }
    else {
        return 1;
    }
}
int main() {
    int m = 3;
    auto g = [&m](int k)->double {return (double)k / 3; };
    cout << f(g, 2) << endl;
    cout << f(g, 5) << endl;
    return 1;
}

И он не компилится пишет:

Ошибка (активно)    E0413   не существует подходящей функции преобразования из "lambda []double (int k)->double" в "double (*)(int)"    

Если написать так то всё работает (квадратные скобки пустые)

auto g = [](int k)->double {return (double)k / 3; };

Что я делаю не так подскажите пожалуйста.

Answer 1

У вас лямбда с захватом - не совсем функция, а функциональный объект... Чтобы исправить ситуацию - проще всего воспользоваться шаблонами:

template<typename Func>
bool f(Func f_, int k) {
    if (f_(k) < 1) {
        return 0;
    }
    else {
        return 1;
    }
}

Еще вариант - использовать function<>:

bool f(function<double(int)> f_, int k) {
    if (f_(k) < 1) {
        return 0;
    }
    else {
        return 1;
    }
}
READ ALSO
Список возможных значений ключа -march для файла qmake.conf

Список возможных значений ключа -march для файла qmake.conf

Например есть файл qmakeconf для MCU iMX6 там значение -march=armv7-a, а для MCU iMX287 рекомендуют -march=armv5te на что конфигуратор ругается

100
C++ &ldquo;CL.exe&rdquo; завершилась с кодом 2 [закрыт]

C++ “CL.exe” завершилась с кодом 2 [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

85
Qt. Установка фокуса кнопке, при обработке keyPressEvent у Key_Down-Key_Up

Qt. Установка фокуса кнопке, при обработке keyPressEvent у Key_Down-Key_Up

Есть форма, на которой расположены несколько кнопок с именами "up", "down", и тд

86