Search code examples
c++c++11lambdafriend

How to make the lambda a friend of a class?


Let's say, I have a class:

class A {
  int a;
};

And I have a lambda:

auto function = [](A* a) {
  a->a;  // <== gives an error in this line.
};

function(new A);

Is there any way to use a private member/method inside a lambda? - It's not necessary to pass the pointer to the lambda - it may be a capture-by or something else.

All reasonable schemes are welcome.


Solution

  • You can do it by creating a friend function that returns the lambda function. It inherits the friend access:

    struct A {
      friend std::function<void(A&, int)> f();
    
      private:
        int i;
        void test() {std::cout << "test: " << i << "\n";}
    };
    
    std::function<void(A&, int)> f() {
      return [] (A &a, int i) {a.i = i; a.test(); };
    }
    
    int main() {
        A a;
        f()(a, 13);
    
        return 0;
    }