ไม่มีวิธีรับที่อยู่ของวัตถุแลมบ์ดาโดยตรงภายในแลมบ์ดา
ตอนนี้มันเกิดขึ้นบ่อยครั้งมีประโยชน์มาก การใช้งานที่พบบ่อยที่สุดคือเพื่อที่จะเรียกคืน
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
ฐานะอาร์กิวเมนต์แรก
ครั้งที่สองตรงกับ combinator y จริง (aka combinator จุดคงที่) ฉันเชื่อว่า ซึ่งคุณต้องการขึ้นอยู่กับความหมายของ 'address of lambda'