No hay forma de obtener directamente la dirección de un objeto lambda dentro de una lambda.
Ahora, como sucede, esto es bastante útil. El uso más común es para recurrir.
El y_combinator
proviene de idiomas donde no se podía hablar de uno mismo hasta que la defina. Se puede implementar con bastante facilidad 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)... );
}
};
ahora puedes hacer esto:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Una variación de esto puede incluir:
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)... );
}
};
donde self
se puede llamar al pasado sin pasar self
como primer argumento.
El segundo coincide con el combinador y real (también conocido como el combinador de punto fijo), creo. Lo que desea depende de lo que quiere decir con "dirección de lambda".