C++ лямбда захват

Как захватить f?

#include <iostream>
using namespace std;

class test
{
    int i=444;
public:
    void(*f)(int)=0;

    void r()
    {
        f(i);
    }
};

int main()
{
    int f=3;

    test t;

    t.f=[&f](int i){cout<<i<<' '<<f;}; //////!!!!!!!

    t.r();

    return 0;
}

Ошибка...

./Playground/file0.cpp: In function 'int main()':
./Playground/file0.cpp:22:32: error: cannot convert 'main()::<lambda(int)>' to 'void (*)(int)' in assignment
   22 |     t.f=[&f](int i){cout<<i<<' '<<f;};

Ответы (2 шт):

Автор решения: Harry

А с чего вы решили, что лямбда имеет тип void(*)(int)?! Лямбда с захватом - это совсем не функция!

Попробуйте так.

#include <functional>
class test
{
    int i=444;
public:
    function<void(int)> f = 0;

    void r()
    {
        f(i);
    }
};

int main()
{
    int f=3;

    test t;

    t.f=[&f](int i){cout<<i<<' '<<f;}; //////!!!!!!!

    t.r();

    return 0;
}
→ Ссылка
Автор решения: ТарасПрогер
#include <iostream>
using namespace std;

class test
{
    int i = 444;
public:
    void(*f)(void*) = nullptr;

    void r()
    {
        int* h = &i;
        f(h);
    }
};

struct Lambda {
    template<typename Tret, typename T>
    static Tret lambda_ptr_exec(void* data) {
        return (Tret)(*(T*)fn<T>())(data);
    }

    template<typename Tret = void, typename Tfp = Tret(*)(void*), typename T>
    static Tfp ptr(T& t) {
        fn<T>(&t);
        return (Tfp)lambda_ptr_exec<Tret, T>;
    }

    template<typename T>
    static void* fn(void* new_fn = nullptr) {
        static void* fn;
        if (new_fn != nullptr)
            fn = new_fn;
        return fn;
    }
};

int main()
{
    int f = 3;

    test t;
    auto b = [&f](void* i) {cout << *((int*)(i)) << ' ' << f; };
    t.f = Lambda::ptr(b); //////!!!!!!!

    t.r();

     
    return 0;
}
→ Ссылка