Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Сделать метод, принимающий лямбду

Сделал тип указателя на функцию:
typedef bool (*BreakFunc)(IReader *reader);
Некоторый класс имеет метод, принимающий в качестве параметра указатель на функцию типа BreakFunc. Он выглядит так:
GaugeReader::addBreakFunc(BreakFunc func);
В методе другого класса я вызываю функцию addBreakFunc так:
CalibProcedure::setBreakpoints() { GaugeReader r; r.addBreakFunc([](IReader *reader){ return false; }); }
Такой код работает без проблем, пока в лямбде не появляются захваченные переменные. В таком случае компилятор сообщает, что не может найти подходящую функцию addBreakFunc. То есть захваченные переменные так повлияли на лямбду, что она перестала соответствовать типу BreakFunc. Почему так произошло? Есть ли другие, более правильные способы заставить метод addBreakFunc принимать лямбду?
Используется C++ 11. Уверен, что правильные способы существуют, так как такие функции есть в библиотеке Qt, например, QtConcurrent::run(тут лямбда), однако в куче прототипов я не нашёл тот, который нужен.
Может быть есть средства Qt, позволяющие решить эту задачу?


Ответ

Вот пример передачи лямбды в качестве аргумента функции. Вероятно, вам нужно именно это. Работает в C++11 и в C++14.
#include #include
void invoke(std::function fun){ int res = fun(123); printf("result: %d
", res); }
int main(int argc, char *argv[]) { int a = 10; auto fun1 = [=](int x) { return x * a; }; auto fun2 = [&](int x) { return x * a; };
invoke(fun1); invoke(fun2); }

Комментариев нет:

Отправить комментарий