Il n'y a aucun moyen d'obtenir directement l'adresse d'un objet lambda dans un lambda.
Maintenant, comme cela arrive, cela est très souvent utile. L'usage le plus courant est pour soigner.
Le y_combinator
vient de langues où vous ne pouviez pas parler de vous jusqu'à ce que vous soyez défini. Il peut être implémenté assez facilement en c ++ :
template<class F>
struct y_combinator {
F f;
template<class...Args>
decltype(auto) operator()(Args&&...args) const {
return f( f, std::forward<Args>(args)... );
}
template<class...Args>
decltype(auto) operator()(Args&&...args) {
return f( f, std::forward<Args>(args)... );
}
};
vous pouvez maintenant le faire:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Une variation de ceci peut inclure:
template<class F>
struct y_combinator {
F f;
template<class...Args>
decltype(auto) operator()(Args&&...args) const {
return f( *this, std::forward<Args>(args)... );
}
template<class...Args>
decltype(auto) operator()(Args&&...args) {
return f( *this, std::forward<Args>(args)... );
}
};
où le self
passé peut être appelé sans passer self
comme premier argument.
Le second correspond au vrai combinateur y (aka le combinateur à virgule fixe) je crois. Ce que vous voulez dépend de ce que vous entendez par «adresse de lambda».