Xavier Lamorlette

C++ : Lambdas

Sommaire :

Syntaxe

The [] construct inside a function call's argument list indicates the beginning of a lambda expression:
[capture](parameters) -> return-type {body}

Capture of variables from local scope:

The return type is optional if the compiler can deduce it unambiguously.

Stockage

std::function<int(int)> foo = [](int a){return a * a;};

Extraction d'une lambda

Au lieu de :

Parameter parameter;
std::vector<A> as;
std::copy_if(as.begin(), as.end(), std::back_inserter(as),
    [& parameter](const A & a) {
        […]
        return result;
    });

on peut écrire :

auto predicate(const Parameter & parameter) {
    return [& parameter](const A & a) {
        […]
        return result;
    });
}

Parameter parameter;
std::vector<A> as;
std::copy_if(as.begin(), as.end(), std::back_inserter(as), predicate(parameter));

Capture interne d'une instance

Capture par référence via this

class A {
    int foo;
    auto get_foo_getter() {
        return [this]() {
            return foo;
        };
    }
};
{
    A a;
    auto lambda = a.get_foo_getter();
    lambda();
}

Capture par copie via *this

class A {
    int foo;
    auto get_foo_getter() {
        return [*this]() {
            return foo;
        };
    }
};
{
    auto lambda = A{}.get_foo_getter();
    lambda();
}

Template Function Object

Permet de simuler une lambda polymorphe :

struct get_foo {
    template <typename T>
    const string & operator() (const T & x) const {
        return x.foo;
    }
};

C++ 20 Lambda Templates

auto foo = []<typename T>(const std::vector<T> & vector_of_stuff) {
        …
    };

La dernière mise à jour de cette page date de décembre 2021.

Le contenu de ce site est, en tant qu'œuvre originale de l'esprit, protégé par le droit d'auteur.
Pour tout commentaire, vous pouvez m'écrire à xavier.lamorlette@gmail.com.