Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/48: Рейтинг темы: голосов - 48, средняя оценка - 4.79
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187

Использование лямбда выражения в качестве аргумента функции

17.11.2016, 17:51. Показов 9980. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После того как я познакомился с ламбда функциями я хотел проверить их знания на некой практике, но я столкнулся с тем, что не знаю как сделать так чтобы функция принимала в качестве аргумента ламбда выражение. Подскажите как это сделать.
И ещё, научите пожалуйста как читать вложенные в друг друга ламбда выражения, например
C++
1
int t = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2016, 17:51
Ответы с готовыми решениями:

Лямбда-функция в качестве аргумента функции
Добрый вечер! Как надо сделать, чтобы вот эта функция могла работать с лямбдой-функцией?: template <typename ReturnType,...

Использование массива в качестве аргумента функции
Доброго времени суток. Помогите разобраться с такой проблемой: #include <cstdio> #include <cstdlib> #include <iostream> ...

Использование массивов в качестве аргумента функции
Расстояние l от начала координата до точки n-мерного пространства с координатами(x1,x2....xn)...

12
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
17.11.2016, 18:14
Например так
C++
1
2
3
4
5
6
7
8
9
10
11
typedef void (*func)();
 
void f(func t) {
    t();
}
 
int main() {
    f([]() {
        cout<<"Ура, заработало!";
    });
}
Добавлено через 18 минут
Или типо такого
C++
1
2
3
4
5
6
7
8
9
10
11
typedef bool (*func)(int);
void f(func t) {
    cout<<t(5);
}
int main() {
 
    auto a=[](int y) {
        return y>0;
    };
    f(a);
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 18:19
Цитата Сообщение от Sinkha Посмотреть сообщение
чтобы функция принимала в качестве аргумента ламбда выражение.
Это достаточно сложно (мб даже невозможно) реализовать. Да и не за чем. Принимайте функтор с помощью template или передавайте std::function (по старинке можно даже указатель на функцию).
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
17.11.2016, 18:19
Или через шаблон
C++
1
2
3
4
5
6
7
8
9
10
11
12
template< typename Func >
void f(Func t,int x) {
    cout<<t(x);
}
int main() {
 
    int x=5;
    auto a=[](int y) {
        return y>0;
    };
    f(a,x);
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 18:19
Цитата Сообщение от Sinkha Посмотреть сообщение
научите пожалуйста как читать вложенные в друг друга ламбда выражения, например
Берёте за жопу автора сего творения и заставляете объяснять.
Лямбды, вложенные в лямбды - не самая лучшая затея.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
17.11.2016, 18:45
Цитата Сообщение от Sinkha Посмотреть сообщение
И ещё, научите пожалуйста как читать вложенные в друг друга ламбда выражения, например
Обычно такие лямбды не самое лучшее решение. Тем более ваш код компилироваться не будет.

Цитата Сообщение от Sinkha Посмотреть сообщение
но я столкнулся с тем, что не знаю как сделать так чтобы функция принимала в качестве аргумента ламбда выражение.
У каждого лямбда-выражения свой собственный тип замыкания, так что помещайте в std::function<> или убедитесь, что не будете использовать различные типы.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.11.2016, 18:54
С++14
C++
1
2
3
auto l = [] ( auto f ) { f(1); };
auto f = [] ( int n ) { std::cout << n << std::endl; };
l( f );
1
 Аватар для Denis Frolov
3 / 3 / 0
Регистрация: 30.08.2021
Сообщений: 4
30.08.2021, 15:57
Я понимаю, что врываюсь тут через 5 лет, но сам искал ответ на вопрос о лямбдах, как аргументах функции, а в поисковых запросах эта страница на самом верху, так что оставлю новый ответ для таких же как и я. И хоть товарищ под ником typedef, по факту, правильно ответил на вопрос, но без разъяснения, понял я это только тогда, когда уже сам разобрался, а ведь ветка форума называется "С++ для начинающих". На самом деле в функциях встроенных библиотек C++ частенько требуется лямбда как аргумент, например std::find_if, что позволяет перейти на них и посмотреть как они работают. Я полагаю, что максимальная полезность такого подхода достигается при максимальном полиморфизме, вот собственно компиляция моих мыслей на счёт этого:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <string>
 
using std::string;
using std::cout;
using std::endl;
 
//Эта лямбда обменивает значения x и y
auto lambda1{
    [](auto& x, auto& y)-> void
    {
        auto buf = x;
        x = y;
        y = buf;
    }
};
 
//Эта лямбда cскладывает x и y с самими собой
auto lambda2{
    [](auto& x, auto& y)-> void
    {
        x += x;
        y += y;
    }
};
 
//Это шаблон функции, где Tx и Ty - это некие операнды, которые будут помещены в некую функцию T
template <typename T, typename Tx, typename Ty>
void func(Tx& x, Ty& y, T lambda)
{
    lambda(x, y);
}
 
int main()
{
    //Для примера, сделаем 2 целочисленные переменные
    int x = 1;
    int y = 2;
 
    //Теперь прогоним их через нашу функцию
    func(x, y, lambda1);
 
    cout << "x = " << x << " y = " << y << endl;//Результат: x = 2 y = 1
 
    func(x, y, lambda2);
 
    cout << "x = " << x << " y = " << y << endl;//Результат: x = 4 y = 2
    
    //Всё работает! Используя лишь одну функцию и меняя в ней только подставляемые лямбды, мы можем управлять её функционалом.
    
    //Но это ещё не всё. Так как здесь всё абстрактно, мы можем использовать и другие типы данных, ничего не меняя, например строки
    string x2 = "a";
    string y2 = "b";
 
    func(x2, y2, lambda1);
 
    cout << "x = " << x2 << " y = " << y2 << endl;//Результат: x = b y = a
 
    func(x2, y2, lambda2);
 
    cout << "x = " << x2 << " y = " << y2 << endl;//Результат: x = bb y = aa
    //Этот фокус пройдёт с вообще любым типом данных для первой лямбды, и для любого типа данных, поддерживающего оператор "+", - для второй
    return 0;
}
/*{
 *Такой подход может быть элегантным решением в некоторых случаях, но если премудрить, читабельность кода резко падает и те, кто тоже будет работать с кодом (включая вас из будущего)
 *не выкупят гения вашего полиморфизма.
}*/
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
30.08.2021, 17:54
Цитата Сообщение от Denis Frolov Посмотреть сообщение
частенько требуется лямбда как аргумент, например std::find_if
Данная функция принимает предикат, а не лямбду
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,986
30.08.2021, 18:12
rikimaru2013, лямбда в качестве предиката:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    std::vector<int> vec{1,2,3,4,5,6,7};
    
    const int to_find = 5;
 
    //лямбда в качестве предиката
    auto it=std::find_if(vec.begin(),vec.end(),[&to_find](auto item)
    {
        return item==to_find;
    });
    
    if(it!=vec.end())
    {
        std::cout<<"found!";
    }
    else
    {
        std::cout<<"not found.";
    }
 
    return 0;
}
0
 Аватар для Denis Frolov
3 / 3 / 0
Регистрация: 30.08.2021
Сообщений: 4
30.08.2021, 19:21
Да, действительно, он принимает предикат, который, по крайней мере на моей практике, почти всегда был лямбдой. Суть не в этом, а в том, что если я знаю, что где-то в std, который однозначно делали умные дяди, которые нашли оптимальное решение, я могу передавать лямбду, то соответственно, можно не изобретать велосипед и просто посмотреть как всё уже сделали до меня.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
30.08.2021, 20:40
Алексей1153, лямбда является функтором, и может быть предикатом. Автор указал не верную информацию, что губительная для молодых умов и я решил поправить его.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
30.08.2021, 20:59
Цитата Сообщение от Denis Frolov Посмотреть сообщение
На самом деле в функциях встроенных библиотек C++ частенько требуется лямбда как аргумент, например std::find_if, что позволяет перейти на них и посмотреть как они работают. Я полагаю, что максимальная полезность такого подхода достигается при максимальном полиморфизме, вот собственно компиляция моих мыслей на счёт этого:
std::find_if - это не функция, это шаблон функции. То есть для того, чтобы передать лямбду в вашу функцию таким способом вам придется превратить вашу функцию в шаблон функции. Вы готовы пойти на такое? Вы осознаете все последствия? Если да, то да, такой способ передачи является наиболее универсальным и эффективным. Так можно передавать что угодно куда угодно.

Если же вы не хотите превращать вашу функцию в шаблон (или не хотите увеличивать количество параметров уже существующего шаблона), то у вас есть другие альтернативы: это либо std::function, либо обычный указатель на функцию (если вы готовы ограничиться лямбдами без захвата).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2021, 20:59
Помогаю со студенческими работами здесь

Лямбда выражение в качестве передаваемого аргумента функции
Добрый день! Подскажите пожалуйста, могу ли я в функциях библиотеки Qt использовать в качестве передаваемого аргумента лямбда...

Передача аргумента в функцию (Лямбда выражения)
Не совсем понял, передача функции в качестве аргумента. А где здесь делегат используется? Или он создается неявно?Или вообще его тут нет?...

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса C++: как правильно использовать метод ...

MuLISP использование результата в качестве аргумента
Не останавливаясь на способе реализации &quot;программы&quot; (умственных способностях, уровне...) подскажите, пожалуйста, можно ли заставить (или...

Передача лямбда-функции в качестве параметра
Коллеги, доброго всем времени суток. Помогите, пожалуйста, с такой проблемой. Передаю функцию в качестве параметра в другую функцию. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru