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;
}