Không có cách nào để trực tiếp lấy địa chỉ của một đối tượng lambda trong lambda.
Bây giờ, vì nó xảy ra điều này khá thường xuyên hữu ích. Việc sử dụng phổ biến nhất là để tái diễn.
Xuất y_combinator
phát từ các ngôn ngữ mà bạn không thể nói về bản thân mình cho đến khi bạn xác định được. Nó có thể được thực hiện khá dễ dàng trong 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)... );
}
};
bây giờ bạn có thể làm điều này:
y_combinator{ [](auto& self) {
std::cout<<"Address of this lambda function is => "<< &self;
} }();
Một biến thể của điều này có thể bao gồm:
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)... );
}
};
trong đó self
thông qua có thể được gọi mà không chuyển qua self
làm đối số đầu tiên.
Cái thứ hai khớp với bộ kết hợp y thực (hay còn gọi là bộ kết hợp điểm cố định) tôi tin. Những gì bạn muốn phụ thuộc vào những gì bạn có nghĩa là 'địa chỉ của lambda'.