#include <functional>
#include <iostream>

template <class... CALLARGS>
class Closure{
public:

    template <class OBJ, typename M, class... CAPARGS>
    Closure(OBJ* obj, M (OBJ::*fct), CAPARGS... capArgs){
        callback =
            [=] (CALLARGS... callArgs) -> void{
                (obj->*fct)(capArgs..., callArgs...);
            };
    }

    template <typename F, class... CAPARGS>
    Closure(F fct, CAPARGS... capArgs){
        callback =
            [=] (CALLARGS... callArgs) -> void{
                fct(capArgs..., callArgs...);
            };
    }

    void operator () (CALLARGS... callArgs){
        callback(callArgs...);
    }

private:
    std::function<void(CALLARGS...)> callback;
};

class A{
public:
    void fct(int a){ std::cout << "A::fct " << a << std::endl; }
};

void plusF(int a){std::cout << "plusF " << a << std::endl;}

int main(void) {
    A a;

    Closure<int> callF(plusF);
    Closure<int> callA(&a, &A::fct);

    callF(1);
    callA(2);

}