Форум программистов, компьютерный форум CyberForum.ru

Передача лямбда в функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.06.2012, 11:37     Передача лямбда в функции #1
В чем смысл передачи лямбда выражения функции?
C++
1
2
auto square = [](int x) { return x * x; };
std::cout << square(16) << std::endl;
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
public:
    Foo(): _x(5) {}
 
    void doSomething() {
        auto lambda = [this](int x) {
            std::cout << _x * x << std::endl;
        };
 
        lambda(4);
    }
 
private:
    int _x;
};
Не понимаю для чего это придумали и какая от этого польза. Не проще ли определить стандартную ф-цию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2012, 11:37     Передача лямбда в функции
Посмотрите здесь:

C++ Передача указателей в функции
Передача функции в функцию? C++
Передача аргументов функции C++
Передача данных из функции C++
C++ Передача функции в аргумент
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2012, 11:44     Передача лямбда в функции #2
Цитата Сообщение от yuron_477 Посмотреть сообщение
В чем смысл передачи лямбда выражения функции?
передачи куда?
Цитата Сообщение от yuron_477 Посмотреть сообщение
Не проще ли определить стандартную ф-цию?
имея указатель на функцию компилятор не может сделать inline функции в место вызова
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.06.2012, 12:10  [ТС]     Передача лямбда в функции #3
А поподробней обяснить можна. Вот ище один пример из книги (Глава называется "Оболочка лямбда-выражения".)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
  // Wrap the lambda expression to compute the HCF
  function<int(int,int)> hcf = [&](int m, int n) mutable ->int{ if(m < n) return hcf(n,m);
                                     int remainder(m%n);
                                     if(0 == remainder) return n;
                                     return hcf(n, remainder);};
  int a(17719), b(18879);
  cout << "For numbers " << a << " and " << b << " the HCF is " << hcf(a, b) << endl;
  a = 103*53*17*97;
  b = 3*29*103;
  cout << "For numbers " << a << " and " << b << " the HCF is " << hcf(a, b) << endl;
 
   return 0;
}
Сам синтаксис написания кода я понял, просто на етом примере я никак немогу понять истенное назначения етого метода.
Цитата Сообщение от Jupiter Посмотреть сообщение
имея указатель на функцию компилятор не может сделать inline функции в место вызова
Ето что то наподобие аналогии указателя на ф-цию?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.06.2012, 12:23     Передача лямбда в функции #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ето что то наподобие аналогии указателя на ф-цию?
нет, лямбда это что-то наподобие функтора, но суть та же самая что и указателя на функцию

Цитата Сообщение от yuron_477 Посмотреть сообщение
просто на етом примере я никак немогу понять истенное назначения етого метода
действительно плохой пример
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
18.06.2012, 18:58     Передача лямбда в функции #5
yuron_477, в тех примерах, что вы привели, действительно, использование лямбды бессмысленно. Вот более наглядный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
   std::vector<int> v = {5, 4, 1, 7, 8, 9};
   std::sort(v.begin(), v.end(), [](int a, int b){return a > b;});
   for(auto i : v)
   {
      std::cout << i << '\t';
   }
   std::cout << std::endl;
}
Здесь мы с помощью лямбды отсортировали массив по убыванию.
http://liveworkspace.org/code/90d041...f41237f5de29ea

Добавлено через 9 минут
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ето что то наподобие аналогии указателя на ф-цию?
Похоже только тем, что и к функции и к лямбде можно обращаться через скобки ().
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
19.06.2012, 03:32     Передача лямбда в функции #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
Не понимаю для чего это придумали и какая от этого польза. Не проще ли определить стандартную ф-цию?
Выглядит иногда лучше чем через ф-циональные объекты.


Кстати в плане эффективности лямбды такие же ф-ции или объекты?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
19.06.2012, 12:44     Передача лямбда в функции #7
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати в плане эффективности лямбды такие же ф-ции или объекты
На сколько я знаю, компилятор воспринимает лямбда-функцию как объект класса, наследованного от std::function со всеми последствиями.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
19.06.2012, 15:59     Передача лямбда в функции #8
А std::function это то что было раньше в boost как я понимаю?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2012, 16:12     Передача лямбда в функции
Еще ссылки по теме:

Передача функции параметром C++
C++ Передача функции в функцию?
C++ Изменение содержимого вектора из лямбда функции

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.06.2012, 16:12     Передача лямбда в функции #9
Avazart, boost::function и сейчас есть в бусте, но да, сделано на основе.

Добавлено через 11 минут
gooseim, Если и унаследованного, то явно не public наследованием. По крайней мере в gcc.
Yandex
Объявления
19.06.2012, 16:12     Передача лямбда в функции
Ответ Создать тему
Опции темы

Текущее время: 02:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru