लैम्ब्डा के भीतर C++ लैम्ब्डा फ़ंक्शन का पता कैसे प्राप्त करें?




c++11 lambda (4)

इसे हल करने का एक तरीका, लैम्बडा को हाथ से लिखे गए फ़नकार वर्ग के साथ बदलना होगा। यह भी है कि मेमने अनिवार्य रूप से हुड के नीचे है।

तब आप इसके माध्यम से पता प्राप्त कर सकते हैं, यहां तक ​​कि कभी भी फ़नकार को एक चर में असाइन किए बिना:

#include <iostream>

class Functor
{
public:
    void operator()() {
        std::cout << "Address of this functor is => " << this;
    }
};

int main()
{
    Functor()();
    return 0;
}

आउटपुट:

Address of this functor is => 0x7ffd4cd3a4df

इसका यह फायदा है कि यह 100% पोर्टेबल है, और इसके बारे में तर्क करने और समझने में बेहद आसान है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि लैम्बडा फ़ंक्शन का पता कैसे प्राप्त किया जाए। यहाँ एक नमूना कोड है:

[]() {
    std::cout << "Address of this lambda function is => " << ????
}();

मुझे पता है कि मैं एक चर में लैम्ब्डा को कैप्चर कर सकता हूं और पता प्रिंट कर सकता हूं, लेकिन मैं इसे उस स्थान पर करना चाहता हूं जब यह अनाम फ़ंक्शन निष्पादित हो रहा हो।

क्या ऐसा करने का एक सरल तरीका है?


यह संभव है लेकिन अत्यधिक प्लेटफॉर्म और कंपाइलर ऑप्टिमाइज़ेशन पर निर्भर करता है।

मुझे पता है कि ज्यादातर आर्किटेक्चर पर, रजिस्टर पॉइंटर कहा जाता है। जब हम फ़ंक्शन के अंदर होते हैं, तो इस समाधान का बिंदु इसे निकालना है।

Amd64 पर निम्नलिखित कोड आपको फ़ंक्शन एक के करीब पते देना चाहिए।

#include <iostream>

void* foo() {
    void* n;
    asm volatile("lea 0(%%rip), %%rax"
      : "=a" (n));
    return n;
}

auto boo = [](){
    void* n;
    asm volatile("lea 0(%%rip), %%rax"
       : "=a" (n));
    return n;
};

int main() {
    std::cout<<"foo"<<'\n'<<((void*)&foo)<<'\n'<<foo()<<std::endl;  
    std::cout<<"boo"<<'\n'<<((void*)&boo)<<'\n'<<boo()<<std::endl;
}

लेकिन उदाहरण के लिए gcc https://godbolt.org/z/dQXmHm साथ -O3 ऑप्टिमाइज़ेशन लेवल फ़ंक्शन को इनलाइन किया जा सकता है।


यहाँ एक वादा संस्करण दृष्टिकोण है:

#include <future>
#include <cstdio>

int main() {
    std::promise<void *> p;

    auto f = [ready_future = p.get_future()]() mutable {
             printf("%p\n", ready_future.get());
        };

    p.set_value(&f);

    f();
}

लंबोदर को पकड़ें:

std::function<void ()> fn = [&fn]() {
  std::cout << "My lambda is " << &fn << std::endl;
}




c++17