Lambda içindeki lambda nesnesinin adresini doğrudan almanın bir yolu yoktur.
Şimdi, olduğu gibi, bu genellikle yararlıdır. En yaygın kullanım, tekrarlamaktır.
y_combinator
Tanımlanmış nerede sizin kadar kendine konuşamadık dillerden gelir. C ++ ile kolayca uygulanabilir :
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)... );
}
};
şimdi bunu yapabilirsiniz:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Bunun bir varyasyonu şunları içerebilir:
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)... );
}
};
Burada self
geçilen self
ilk argüman olarak geçmeden çağrılabilir .
İkincisi, gerçek y birleştiriciyle (sabit nokta birleştiricisi olarak da bilinir) eşleştiğine inanıyorum. Hangisini istediğiniz 'lambda adresi' ile ne demek istediğinize bağlıdır.