Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/23: Рейтинг темы: голосов - 23, средняя оценка - 4.65
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

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

15.04.2020, 16:15. Показов 4980. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет
помогите пожалуйста разобраться с лямбда функциями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
void foo(int a){a++;}
 
 
 
int main(){
 
int b=5;
foo(b, [](int b){++b; std::cout << b;}(b));
 
 
}
 
не получается использовать лямбда функцию в качестве аргумента в другой фунции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2020, 16:15
Ответы с готовыми решениями:

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

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

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

17
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 16:18
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
не получается использовать лямбда функцию в качестве аргумента в другой фунции
У тебя нет функции, принимающей в качестве аргумента другую функцию/функтор.
Цитата Сообщение от pcmax Посмотреть сообщение
foo(b, [](int b){++b; std::cout << b;}(b));
Что ты хотел тут сделать, словами объясни?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.04.2020, 16:25
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
не получается использовать лямбда функцию в качестве аргумента в другой фунции.
ты вообще понимаешь, что ты пытаешься сделать?

у тебя у функции:
Цитата Сообщение от pcmax Посмотреть сообщение
void foo(int a){a++;}
тип параметра - int

вот с какого перепугу ты решил, что в неё можно запихивать лямбду?
ты сделать то что пытаешься вообще?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 16:35  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
У тебя нет функции, принимающей в качестве аргумента другую функцию/функтор.
так это лямбда выражение. это же не функция, несмотря на то что я так указал в теме. я понимаю это как выражение.

я же могу сделать так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
void foo (int a){std::cout << a;}
 
 
int main(){
int b=5;
foo(b+5);
 
так почему же я не могу тогда сделать тоже самое , но с лямбда выражением?
 
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 16:38
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
я же могу сделать так?
так что ли?
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
void foo(int a) { a++; }
 
int main() {
 
    int b = 5;
    foo([](int b) {++b; std::cout << b; return b; }(b));
}
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 16:51  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
ты вообще понимаешь, что ты пытаешься сделать?
Цитата Сообщение от zayats80888 Посмотреть сообщение
Что ты хотел тут сделать, словами объясни?


хочу понять как работает.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
есть функция
 
void foo(int a){std::cout << a;}
 
int main(){
// теперь хочу вот эту переменную увеличить в лямбда выражении и вывести на экран
int b=5;
 
//[](int b){++b;}(b)// так работает. теперь хочу вставить это вместо параметра в функцию foo
 
foo(int b, [](int b){++b;}(b));
 
}
Добавлено через 55 секунд
Цитата Сообщение от zayats80888 Посмотреть сообщение
так что ли?

похоже. щас испытаю

Добавлено через 6 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
foo([](int b) {++b; std::cout << b; return b; }(b))
вопрос: зачем return?

Добавлено через 4 минуты
и как работает захват?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
 
int main(){
int a=11;
 
[&a](int a){a=a+4;}
 
std::cout << a;
// выведет 4.
почему? я же сделал захват по ссылке? лямбда должна работать не с локальной переменной, а с переменной 'a' что объявлена в main
 
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.04.2020, 17:15
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
я же сделал захват по ссылке
Ну так имена используй разные.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 17:21
Цитата Сообщение от pcmax Посмотреть сообщение
вопрос: зачем return?
Затем, что твоя функция foo принимает аргумент типа int.
Поэтому результатом выражения, в котором этот аргумент вычисляется, должен быть объект типа int(или неявно кастится к нему).
У тебя какое то не правильное понимание лямбды. Если грубо - то это просто функтор(объект с оператором вызова operator()).

Цитата Сообщение от pcmax Посмотреть сообщение
// выведет 4.
Этот код даже не скомпилируется. О каком выводе идет речь?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.04.2020, 17:24
Цитата Сообщение от pcmax Посмотреть сообщение
// выведет 4.
это не скомпилируется.
ты написал бред.

1.
во-первых, не хватает точки с запятой: [&a](int a){a=a+4;};

2.
во-вторых, это что за бред? [&a](int a){a=a+4;}

почему у тебя аргумент функтора и имя захваченной переменной совпадают?
хочешь писать код, который запутает и тебя, и людей?

3.
в-третьих. ты объявил безымяную лямбду - временный объект.
существование которого вообще никак не сказывается на работе программы.

4.
ты нигде не запускаешь лямбду на выполнение.
а значит она никак не изменяет состояние переменной

если бы ты не забыл точку-с-запятой, и довел код до компилябельного состояния,
тогда в консоль высветилось бы число 11.

/ps:
как можно было в одной маленькой строчке допустить столько косяков ???
это - талант!
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 17:57  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
хочешь писать код, который запутает и тебя, и людей?
ребята, вы чего? кого я хочу запутать? я блин разобраться не могу. зашел к вам. а вы чего говорите!

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
Этот код даже не скомпилируется. О каком выводе идет речь?
это просто пример. абстракция.
код в любом случае будет не рабочий, потому что я не знаю как писать. я не понимаю лямбду в плюсах.

Добавлено через 6 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если грубо - то это просто функтор(объект с оператором вызова operator()).
давайте пожалуйста попорядку. функтор-это объект который ведет себя как функция .

C++
1
2
void operator()(){};
он void, какой тут return ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 18:07
Цитата Сообщение от pcmax Посмотреть сообщение
код в любом случае будет не рабочий, потому что я не знаю как писать.
тогда не "примеры и абстракции" приводи, а формулируй техническое задание.
Цитата Сообщение от pcmax Посмотреть сообщение
давайте пожалуйста попорядку. функтор-это объект который ведет себя как функция .
Цитата Сообщение от pcmax Посмотреть сообщение
он void, какой тут return ?
То есть о функциях, возвращающих не void ты не слышал?
Если у лямбды не указывать тип возвращаемого значения, то он будет выведен автоматически.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 18:12  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если у лямбды не указывать тип возвращаемого значения, то он будет выведен автоматически.

тогда почему без return не работает?

C++
1
foo([](int b) {++b; std::cout << b; }(b))
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 18:19
Цитата Сообщение от pcmax Посмотреть сообщение
тогда почему без return не работает?
Как раз потому, что из void никак не получить int.
Это всё равно что:
C++
1
2
3
void foo(){}
//...
int a = foo();
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 18:54  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Как раз потому, что из void никак не получить int.

return чей? лябмда или foo?

если лямбда тогда почему не ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int man(){
 
int a=1;
int b=0;
 
b=[&a](){a++;}(); 
 
компилятор ругается что лямбда void
 
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2020, 19:04
Цитата Сообщение от pcmax Посмотреть сообщение
компилятор ругается что лямбда void
а я постом выше о чём писал?

Добавлено через 5 минут
Цитата Сообщение от pcmax Посмотреть сообщение
#include <iostream>
int man(){
int a=1;
int b=0;
b=[&a](){a++;}();
компилятор ругается что лямбда void
}
Аналог с функтором:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int man() {
 
    int a = 1;
    int b = 0;
 
    struct Lambda // аналог твоей лямбды
    {
        int& a;
 
        Lambda(int& val) :a(val) {}
 
        auto operator()() { a++; } // тип автоматом будет void
    };
 
    b = Lambda{ a }(); // понимаешь, что void в int - это ошибка?
}
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
15.04.2020, 21:53  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main(){
 
int a=5;
int b=0;
 
b=[&a]() -> int {a++; return a;}();
 
 
// сори, что-то затупил.
 
спасибо что помогаете ребята.
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,259
15.04.2020, 21:59
Цитата Сообщение от pcmax Посмотреть сообщение
b=[&a]() -> int {a++; return a;}();
Можно и короче

C++
1
b=[&a]{a++; return a;}();
Благодаря этому []{}() - вполне легальное выражение в С++, как впрочем и [](){} и [](){}().
2
1 / 1 / 0
Регистрация: 16.04.2020
Сообщений: 1
16.04.2020, 07:33
Имена просто разные юзай, да и всё:)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2020, 07:33
Помогаю со студенческими работами здесь

Функция в качестве аргумента другой функции
Есть такая задачка: С заданной точностью eps вычислить площадь плоской фигуры, ограниченной тремя кривыми, уравнения которых...

Функция в качестве аргумента другой функции по умолчанию
Здравствуйте, поясню немного заголовок. Аргумент функции по умолчанию: void function ( int a=0 ) { ... } Функция в качестве...

Передача функции в качестве аргумента другой функции
в книге Харви и Пол Дейтл нашел следующий вариант решения задачи, передачи функции в качестве параметра: сортировка двух чисел))) ...

Как передать функции указатель на функцию в качестве аргумента?
как передать функции указатель на функцию в качестве аргумента?

как передать функции в качестве аргумента указатель на функцию описанной в другом классе?
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в funcA_1 создается экземпляр класса B и...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru