Как отловить адрес функтора, сгенерированного для лямда-выражения? - PullRequest
3 голосов
/ 18 октября 2019

вы знаете, что компилятор преобразует лямбда-выражение в некий функтор:

захваченные переменные становятся членами данных этого функтора. Переменные, захваченные по значению, копируются в элементы данных функтора. Эти элементы данных имеют ту же самую константность, что и захваченные переменные и так далее ...

Теперь мне интересно, возможно ли перехватить адрес этого скрытого объекта, сгенерированного компилятором за кулисами

Iдать вам простой фрагмент (НЕПРАВИЛЬНОГО) кода, чтобы показать мои намерения:

#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();

}

Ссылка на Coliru

Я бы хотел, чтобы скрытый функтор вел себя как MetaDatas.

Может кто-нибудь очистить мой разум?

Спасибо за ваше время.

1 Ответ

1 голос
/ 18 октября 2019

Синтаксис будет:

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

Возможное решение - использование Y-комбинатора, что-то вроде:

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

Демо

...