Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to catch the address of the functor generated for a lamda expression?

Tags:

c++

c++11

c++14

you know that the compiler transforms a lambda expression into some kind of functor:

the captured variables become data members of this functor. Variables captured by value are copied into data members of the functor. These data members have the same constness as the captured variables et cetera...

Now I wonder if it's possible to catch the address of this hidden object generated from the compiler behind the scenes

I give you a simple snippet of (WRONG) code just to show my intentions:

#include <iostream>

using namespace std;

class MetaData
{
  public:
  void printAddress()
  {
    cout << "\n printAddress:Instance of MetaData at &" << this;
  }
};

int main()
{
    MetaData md1;
    cout << "\n &md1 = " << &md1 << "\n";

    md1.printAddress();

    cout << "\n\n--------------------\n\n";

    int i = 5;

    auto x = [i]() mutable {
        //cout << "\n The address of the functor is &" << this;      // ERROR  ! ! ! 
        cout << "\n Hello from Lambda ";
        cout << "\n &i = " << &i << " ++i ==> " << ++i << endl; };    

    x();    //    executing lambda

    auto y = x;        //    y is constructed with copy ctor

    y();

}

Link to Coliru

I'd like hidden functor to behave like MetaDatas.

Can someone clear my mind?

Thanks for your time.

like image 518
openyourmind Avatar asked Dec 11 '25 02:12

openyourmind


1 Answers

Syntax would be:

auto x = [&](){ std::cout << &x; }; // but it is illegal too:
// variable 'x' declared with deduced type 'auto' cannot appear in its own initializer

Possible work-around is usage of Y-combinator, something like:

auto x = [i](auto& self) mutable {
    cout << "\n The address of the functor is &" << &self;
    cout << "\n Hello from Lambda ";
    cout << "\n &i = " << &i << " ++i ==> " << ++i << endl; };    

x(x);    //    executing lambda

Demo

like image 122
Jarod42 Avatar answered Dec 13 '25 14:12

Jarod42



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!