Nie ma bezpośredniego sposobu uzyskania adresu obiektu lambda w lambda.
Tak się składa, że jest to często przydatne. Najczęstszym zastosowaniem jest powtórzenie.
y_combinator
Pochodzi z języków, w których nie można było mówić o sobie, aż was gdzie zdefiniowane. Można go dość łatwo zaimplementować w 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)... );
}
};
teraz możesz to zrobić:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Odmiany tego mogą obejmować:
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)... );
}
};
gdzie self
przekazany można wywołać bez podawania self
jako pierwszego argumentu.
Drugi odpowiada rzeczywistemu kombinatorowi y (czyli kombinatorowi punktu stałego). To, czego chcesz, zależy od tego, co rozumiesz przez „adres lambda”.