How to capture f?
# include & lt; iostream & gt;
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 = [& amp; f] (int i) {cout & lt; & lt; i & lt; & lt; ' '& lt; & lt; f;}; ////// !!!!!!!
T.R ();
Return 0;
}
Error …
./ playground / file0.cpp: in function 'int Main ()':
./Playground/file0.cppp: CONVERT 'MAIN () :: & lt; lambda (int) & gt;' to 'void (*) (int)' in assignment
22 | t.f = [& amp; f] (int i) {cout & lt; & lt; i & lt; & lt; ' '& lt; & lt; f;};
Answer 1, Authority 100%
And where did you decide that Lambda has the type void (*) (int)
?! Lambda with capture – this is not a function at all!
Try it.
# include & lt; functional & gt;
Class Test
{
int i = 444;
Public:
FUNCTION & LT; Void (int) & gt; f = 0;
Void R ()
{
F (i);
}
};
INT MAIN ()
{
int f = 3;
Test T;
t.f = [& amp; f] (int i) {cout & lt; & lt; i & lt; & lt; ' '& lt; & lt; f;}; ////// !!!!!!!
T.R ();
Return 0;
}
Answer 2, Authority 25%
# include & lt; iostream & gt;
Using Namespace STD;
Class Test
{
int i = 444;
Public:
void (* f) (void *) = nullptr;
Void R ()
{
int * h = & amp; i;
f (h);
}
};
STRUCT LAMBDA {
TEMPLATE & LT; TYPENAME TRET, TYPENAME T & GT;
STATIC TRET LAMBDA_PTR_EXEC (void * data) {
Return (TRT) (* (T *) Fn & LT; T & GT; ()) (DATA);
}
TEMPLATE & LT; TYPENAME TRET = VOID, TYPENAME TFP = TRET (*) (Void *), TypeName T & GT;
STATIC TFP PTR (T & AMP; T) {
Fn & lt; T & GT; (& amp; t);
Return (TFP) Lambda_PTR_EXEC & LT; TRET, T & GT ;;
}
TEMPLATE & LT; TYPENAME T & GT;
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 = [& amp; f] (void * i) {cout & lt; & lt; * ((int *) (i)) & lt; & lt; '' & lt; & lt; f; };
t.f = lambda :: ptr (b); ////// !!!!!!!
T.R ();
Return 0;
}