Немає можливості безпосередньо отримати адресу об’єкта лямбда в межах лямбда.
Зараз, як це буває, це досить часто корисно. Найбільш поширене використання - для рецидиву.
y_combinator
Приходить з мов , де ви ніколи не могли говорити про себе , поки ви де визначено. Її можна легко реалізувати у програмі 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)... );
}
};
тепер ви можете це зробити:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Варіанти цього можуть включати:
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)... );
}
};
де self
передане можна викликати без передачі в self
якості першого аргументу.
Другий відповідає реальному комбінатору y (я вважаю, також комбінатор фіксованої точки). Що ви хочете, залежить від того, що ви маєте на увазі під "адресою лямбда".