Я использовал функцию лямбда, чтобы передать ее функции std::condition_variable
wait(), но это не так. Я использую лямбда-функции, которые не получают никаких параметров, и все абсолютно ясно для меня. Но я полностью не понимаю, как используется функция lamdba, которая имеет список параметров. Показывать lambda с параметрами? Как передать им параметры?
С++ 11 лямбда-функция - как передать параметр
Ответ 1
Показывать lambda с параметрами? Как передать им параметры?
Он работает точно так же, как с любым другим типом вызываемого объекта:
#include <iostream>
int main()
{
auto l = [] (int i) { std::cout << "The answer is " << i; };
l(42);
}
Также обратите внимание, что вам не нужно хранить лямбда в переменной, чтобы вызвать ее. Ниже приведен альтернативный способ перезаписи вышеуказанной программы:
#include <iostream>
int main()
{
[] (int i) { std::cout << "The answer is " << i; } (42);
// ^^^^
// Invoked immediately!
}
Тип лямбда-функции (так называемое "лямбда-замыкание" ) определяется компилятором и является функтором с оператором вызова, подпись которого указана при определении лямбда. Поэтому вы называете лямбда точно так же, как вы бы назвали функтор (т.е. Точно так же, как вы бы вызвали функцию - или любой вызываемый объект).
Таким образом, если вы хотите назначить лямбда объекту, наилучшей практикой является позволить компилятору вывести его тип с помощью auto
. Если вы не хотите или не можете использовать auto
, вы можете:
-
Используйте указатели на функции для не-захвата lambdas (захват lambdas не конвертируется в указатели на функции). В приведенном выше случае, таким образом, будет также работать следующее:
#include <iostream> int main() { void (*f)(int) = [] (int i) { std::cout << "The answer is " << i; }; f(42); }
-
Используйте
std::function
(это всегда возможно, даже если лямбда захватывается):#include <iostream> #include <functional> int main() { std::function<void(int)> f = [] (int i) { std::cout << "The answer is " << i; }; f(42); }
Ответ 2
auto lambda = [] (int a, int b) { return a + b; };
assert(lambda(1, 2) == 3);
Ответ 3
Вам даже не нужна переменная для хранения лямбда - вы можете называть ее напрямую:
std::cout << [](int n) { return n + 1 ; } (99) << std::endl ;