Es gibt keine Möglichkeit, die Adresse eines Lambda-Objekts innerhalb eines Lambda direkt abzurufen.
Nun, wie es passiert, ist dies ziemlich oft nützlich. Die häufigste Verwendung ist, um zu rekursieren.
Das y_combinator
kommt aus Sprachen, in denen Sie nicht über sich selbst sprechen konnten, bis Sie definiert wurden. Es kann ziemlich einfach in c ++ implementiert werden :
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)... );
}
};
Jetzt können Sie dies tun:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Eine Variation davon kann umfassen:
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)... );
}
};
wobei das self
übergebene aufgerufen werden kann, ohne self
als erstes Argument übergeben zu werden.
Der zweite entspricht dem Real-Y-Kombinator (auch bekannt als Fixpunkt-Kombinator), glaube ich. Was Sie wollen, hängt davon ab, was Sie unter "Lambda-Adresse" verstehen.