Пример использования лямбда-функции как значения поля класса — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(+ замечание про [=])
(убрали имя alloc (не имеет прямого отношения к примеру))
Строка 20: Строка 20:
  
 
         // функциональное поле: будет хранить функцию от одного аргумент int и возвращать void  
 
         // функциональное поле: будет хранить функцию от одного аргумент int и возвращать void  
std::function<void(int)> alloc;  
+
std::function<void(int)> fun;  
  
 
void setF() {  
 
void setF() {  
alloc = [=](int N){ this->b.f(N); }; // лямбда-функция (то есть безымянная функция) от одного int-аргумента N
+
fun = [=](int N){ this->b.f(N); }; // лямбда-функция (то есть безымянная функция) от одного int-аргумента N
 
                                                     // вызывает b.f(N)
 
                                                     // вызывает b.f(N)
 
}
 
}
  
 
void setG() {  
 
void setG() {  
alloc = [=](int N){ this->b.g(N); };
+
fun = [=](int N){ this->b.g(N); };
 
}
 
}
 
};
 
};
Строка 35: Строка 35:
 
{
 
{
 
Foo f;
 
Foo f;
f.alloc(42); // >>> Bar::f(42)
+
f.fun(42); // >>> Bar::f(42)
 
f.setG();
 
f.setG();
f.alloc(43); // >>> Bar::g(43)
+
f.fun(43); // >>> Bar::g(43)
 
}
 
}
 
</source>
 
</source>

Версия 19:09, 7 декабря 2014

#include <functional>
#include <iostream>

using std::cout;
using std::endl;

class Bar {
public:
	void f(int n) { cout << "Bar::f(" << n << ")" << endl; }

	void g(int n) { cout << "Bar::g(" << n << ")" << endl; }
};

class Foo {

	Bar b;

public:
	Foo() { setF(); }

        // функциональное поле: будет хранить функцию от одного аргумент int и возвращать void 
	std::function<void(int)> fun; 

	void setF() { 
		fun = [=](int N){ this->b.f(N); }; // лямбда-функция (то есть безымянная функция) от одного int-аргумента N
                                                     // вызывает b.f(N)
	}

	void setG() { 
		fun = [=](int N){ this->b.g(N); };
	}
};

int main()
{
	Foo f;
	f.fun(42); // >>> Bar::f(42)
	f.setG();
	f.fun(43); // >>> Bar::g(43)
}


Замечание о [=]

Для лямбда-функций требуется писать кое-что внутри квадратных скобок, если внутри лямбда-функции используются переменные из контекста определения этой функции. В нашем примере лямбда-функция использует this. Значок = означает, что все захватываемые из контекста переменные передаются по значению. Если вместо = написать &, то все захваченные переменные будут передаваться по ссылке. Также можно указывать тип захвата индивидуально для каждой переменной. В нашем примере захватывается только указатель this, а указатели обычно всегда передаются по значению (в обычных функциях тоже), потому пишем =.