#include <stdio.h>
struct myclass {

    int classattr;
    myclass() : classattr(8888) { }

    void test()
    {
        int localvar= 9999;
        printf("localvar=  %p  %d\n", &localvar, localvar);
        printf("this=          %p\n", this);
        printf("classattr= %p  %d\n", &classattr, classattr);

        printf("calling [localvar, this]\n");
        calllambda( 1234,
            [localvar, this](int x) {
                auto tthis= this;
                auto llocalvar= localvar;
                printf("x=         %p  %d\n", &x, x);
                printf("localvar=  %p  %d\n", &localvar, localvar);
                printf("this=          %p\n", this);
                printf("classattr= %p  %d\n", &classattr, classattr);

                printf("...calling [localvar, this]\n");
                this->calllambda( 4321,
                    [llocalvar, tthis,x](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("llocalvar=  %p  %d\n", &llocalvar, llocalvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &tthis->classattr, tthis->classattr);
                    }
                );
                printf("...calling [=]\n");
                this->calllambda( 4321,
                    [=](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("localvar=  %p  %d\n", &localvar, localvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &classattr, classattr);

                    }
                );
//              printf("...calling [&]\n");
//              this->calllambda( 4321,
//                  [&](int y) {
//                      printf("x=         %p  %d\n", &x, x);
//                      printf("y=         %p  %d\n", &y, y);
//                      printf("localvar=  %p  %d\n", &localvar, localvar);
//                      printf("this=          %p\n", tthis);
//                      printf("classattr= %p  %d\n", &classattr, classattr);

//                  }
//              );


            }
        );
        printf("calling [=]\n");
        calllambda( 1234,
            [=](int x) {
                auto tthis= this;
                auto llocalvar= localvar;
                printf("x=         %p  %d\n", &x, x);
                printf("localvar=  %p  %d\n", &localvar, localvar);
                printf("this=          %p\n", this);
                printf("classattr= %p  %d\n", &classattr, classattr);

                printf("...calling [localvar, this]\n");
                this->calllambda( 4321,
                    [llocalvar, tthis, x](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("llocalvar=  %p  %d\n", &llocalvar, llocalvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &tthis->classattr, tthis->classattr);
                    }
                );
                printf("...calling [=]\n");
                this->calllambda( 4321,
                    [=](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("localvar=  %p  %d\n", &localvar, localvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &classattr, classattr);

                    }
                );
//              printf("...calling [&]\n");
//              this->calllambda( 4321,
//                  [&](int y) {
//                      printf("x=         %p  %d\n", &x, x);
//                      printf("y=         %p  %d\n", &y, y);
//                      printf("localvar=  %p  %d\n", &localvar, localvar);
//                      printf("this=          %p\n", tthis);
//                      printf("classattr= %p  %d\n", &classattr, classattr);

//                  }
//              );


            }
        );
        printf("calling [&]\n");
        calllambda( 1234,
            [&](int x) {
                auto tthis= this;
                auto llocalvar= localvar;
                printf("x=         %p  %d\n", &x, x);
                printf("localvar=  %p  %d\n", &localvar, localvar);
                printf("this=          %p\n", this);
                printf("classattr= %p  %d\n", &classattr, classattr);

                printf("...calling [localvar, this]\n");
                this->calllambda( 4321,
                    [llocalvar, tthis, x](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("llocalvar=  %p  %d\n", &llocalvar, llocalvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &tthis->classattr, tthis->classattr);
                    }
                );
                printf("...calling [=]\n");
                this->calllambda( 4321,
                    [=](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("localvar=  %p  %d\n", &localvar, localvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &classattr, classattr);

                    }
                );
                printf("...calling [&]\n");
                this->calllambda( 4321,
                    [&](int y) {
                        printf("x=         %p  %d\n", &x, x);
                        printf("y=         %p  %d\n", &y, y);
                        printf("localvar=  %p  %d\n", &localvar, localvar);
                        printf("this=          %p\n", tthis);
                        printf("classattr= %p  %d\n", &classattr, classattr);

                    }
                );

            }
        );
    }

    template<typename F>
    void calllambda(int x, F f)
    {
        f(x);
    }


};

int main(int,char**)
{
    myclass mc;
    mc.test();
}
