Пример использования лямбда-функции как значения поля класса — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Ulysses (обсуждение | вклад) (+ замечание про [=]) |
Ulysses (обсуждение | вклад) м |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 20: | Строка 20: | ||
// функциональное поле: будет хранить функцию от одного аргумент int и возвращать void | // функциональное поле: будет хранить функцию от одного аргумент int и возвращать void | ||
− | std::function<void(int)> | + | std::function<void(int)> fun; |
void setF() { | void setF() { | ||
− | + | fun = [=](int N){ this->b.f(N); }; // лямбда-функция (то есть безымянная функция) от одного int-аргумента N | |
// вызывает b.f(N) | // вызывает b.f(N) | ||
} | } | ||
void setG() { | void setG() { | ||
− | + | fun = [=](int N){ this->b.g(N); }; | |
} | } | ||
}; | }; | ||
Строка 35: | Строка 35: | ||
{ | { | ||
Foo f; | Foo f; | ||
− | f. | + | f.fun(42); // >>> Bar::f(42) |
f.setG(); | f.setG(); | ||
− | f. | + | f.fun(43); // >>> Bar::g(43) |
} | } | ||
</source> | </source> | ||
Строка 44: | Строка 44: | ||
== Замечание о <tt>[=]</tt> == | == Замечание о <tt>[=]</tt> == | ||
− | Для лямбда- | + | Для лямбда-функции требуется писать ''кое-что'' внутри квадратных скобок, если она использует переменные из '''контекста''' определения. В нашем примере лямбда-функция использует <tt>this</tt>. Значок <tt>=</tt> означает, что все захватываемые из контекста переменные передаются по значению. Если вместо <tt>=</tt> написать <tt>&</tt>, то все захваченные переменные будут передаваться по ссылке. Также можно указывать тип захвата индивидуально для каждой переменной. В нашем примере захватывается только указатель this, а указатели обычно всегда передаются по значению (в обычных функциях тоже), потому пишем <tt>=</tt>. |
Текущая версия на 19:11, 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, а указатели обычно всегда передаются по значению (в обычных функциях тоже), потому пишем =.