#include <functional>

template<class T, class RetType, class...Args>
RetType CallMemFn(T* obj, RetType(T::*func)(Args...), Args...args)
{return ((*obj).*(func))(std::forward<Args>(args)...);}

struct ConnectionHandle {};

template<class RetType, class...Args>
ConnectionHandle connect(std::function<RetType(Args...)> func)
{return {};}

template<class RetType, class...Args>
ConnectionHandle connect(RetType(*func)(Args...))
{return connect(std::function<RetType(Args...)>(func));}

template<class T, class RetType, class...Args>
struct boundthis {
    typedef RetType result_type;
	typedef T* thistype;
	typedef RetType(*signature)(Args...);
    boundthis(T* self, RetType(T::*func)(Args...)) :self(self), func(func) {}
    RetType operator()(Args...args) {return CallMemFn(self,func,std::forward<Args>(args)...);}
private:
	T* self;
	RetType(T::*func)(Args...);
};
template<class T, class RetType, class...Args>
boundthis<T,RetType,Args...> bindthis(T* self, RetType(T::*func)(Args...))
{return boundthis<T,RetType,Args...>(self, func);}

template<class T, class RetType, class...Args>
ConnectionHandle connect(T* obj, RetType(T::*func)(Args...))
{return connect(std::function<RetType(Args...)>(bindthis(obj, func)));}
    
    
struct X
{
    void memberFunction(int a, int b)
    {
         // do something
    }
};

void globalStaticFunction(int a, int b)
{
    // do something
}


int main()
{
    // test instance
    X x;


    // connect a static function to the signal
    connect(&globalStaticFunction);

    // connect a member function
    // here we have to use std::bind to get a std::function
    connect(&x, &X::memberFunction);
}