Страницы

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

воскресенье, 29 декабря 2019 г.

Как присвоить переменной лямбда функцию без использования auto

#cpp #лямбда_выражение


Например есть лямбда которая возвращает какое-либо значение из функции

#include 

int main()
{
    auto f = []()
    {
        std::cout << "Lambda has been invoked" << std::endl;
        return 10;
    };
    std::cout << f() << std::endl;
}


Там указано ключевое слово auto. Но как мне указать определенный тип потому что вот
так не работает

#include 

int main()
{
    int f = []() //поменял auto yfいんt
    {
        std::cout << "Lambda has been invoked" << std::endl;
        return 10;
    };
    std::cout << f() << std::endl;
}


Простите за глупый вопрос
    


Ответы

Ответ 1



#include int main() { int (*f)() = []()->int { std::cout << "Lambda has been invoked" << std::endl; return 10; }; std::cout << f() << std::endl; } Соответственно если вам нужны аргументы: #include int main() { int (*f)(char) = [](char c)->int { std::cout << c << std::endl; return 10; }; std::cout << f('a') << std::endl; }

Ответ 2



Указатели на функции, предложенные @uber42, будут работать только если у лямбды пустой список захвата []. auto a = []{return 42;}; // Компилируется int (*b)() = []{return 42;}; // Компилируется int x = 42; auto с = [x](){return x;}; // Компилируется int (*d)() = [x](){return x;}; // Ошибка: cannot convert 'main()::' to 'int (*)()' in initialization Типы ламбд - это не указатели на функии. Каждая лямбда имеет свой анонимный тип, который по сути является классом с перегруженным оператором (). Лямбду можно преобразовать к указателю на функцию только если у нее пустой список захвата []. Обратите внимание на слова "анонимный тип" - раз у типа нет имени, то его не получится указать явно, и придется использовать auto. Можно использовать std::function (или похожий класс-обертку), который работает всегда, независимо от наличия списка захвата: std::function e = [x](){return x;}; // Компилируется Однако нужно понимать, что std::function занимает больше памяти, чем тип, определенный auto, и вызывается медленнее (или уж точно не быстрее). Поэтому auto предпочтительнее.

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

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