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

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

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

Author24 — интернет-сервис помощи студентам
привет
помогите пожалуйста разобраться с лямбда функциями.
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2020, 16:15
Ответы с готовыми решениями:

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

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

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

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

17
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.04.2020, 16:18 2
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

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

Решение

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

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

вот с какого перепугу ты решил, что в неё можно запихивать лямбду?
ты сделать то что пытаешься вообще?
1
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
15.04.2020, 16:35  [ТС] 4
Цитата Сообщение от 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
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.04.2020, 16:38 5
Лучший ответ Сообщение было отмечено 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
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
15.04.2020, 16:51  [ТС] 6
Цитата Сообщение от 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
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
15.04.2020, 17:15 7
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

C++
1
foo([](int b) {++b; std::cout << b; }(b))
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.04.2020, 18:19 13
Цитата Сообщение от pcmax Посмотреть сообщение
тогда почему без return не работает?
Как раз потому, что из void никак не получить int.
Это всё равно что:
C++
1
2
3
void foo(){}
//...
int a = foo();
1
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
15.04.2020, 18:54  [ТС] 14
Цитата Сообщение от 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
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
15.04.2020, 19:04 15
Цитата Сообщение от 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
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
15.04.2020, 21:53  [ТС] 16
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Эксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,066
15.04.2020, 21:59 17
Цитата Сообщение от 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 18
Имена просто разные юзай, да и всё:)
1
16.04.2020, 07:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2020, 07:33
Помогаю со студенческими работами здесь

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

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

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

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

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru