Подтвердить что ты не робот

С++ 11 лямбда-функция - как передать параметр

Я использовал функцию лямбда, чтобы передать ее функции std::condition_variable wait(), но это не так. Я использую лямбда-функции, которые не получают никаких параметров, и все абсолютно ясно для меня. Но я полностью не понимаю, как используется функция lamdba, которая имеет список параметров. Показывать lambda с параметрами? Как передать им параметры?

4b9b3361

Ответ 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 ;