Não há como obter diretamente o endereço de um objeto lambda dentro de um lambda.
Agora, como acontece, isso geralmente é útil. O uso mais comum é para se recuperar.
Ele y_combinator
vem de idiomas em que você não poderia falar sobre si mesmo até onde foi definido. Ele pode ser implementado facilmente no 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)... );
}
};
agora você pode fazer isso:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Uma variação disso pode 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)... );
}
};
onde o self
passado pode ser chamado sem passar self
como o primeiro argumento.
O segundo corresponde ao combinador real y (também conhecido como combinador de ponto fixo), acredito. O que você deseja depende do que você quer dizer com 'endereço de lambda'.