Tidak ada cara untuk secara langsung mendapatkan alamat objek lambda dalam lambda.
Sekarang, seperti yang terjadi ini cukup sering berguna. Penggunaan yang paling umum adalah untuk pengulangan.
The y_combinator
berasal dari bahasa mana Anda tidak bisa bicara tentang diri Anda sampai Anda mana yang ditetapkan. Ini dapat diimplementasikan dengan mudah di 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)... );
}
};
sekarang kamu bisa melakukan ini:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Variasi dari ini dapat meliputi:
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)... );
}
};
di mana yang self
berlalu dapat dipanggil tanpa lewat self
sebagai argumen pertama.
Yang kedua cocok dengan kombinator y asli (alias kombinator titik tetap) saya percaya. Yang Anda inginkan tergantung pada apa yang Anda maksud dengan 'alamat lambda'.