#include <iostream>
#include <type_traits>

template< typename R, typename C, typename... Args>
class delegate
{
public:
    template<R(C::*F)(Args...), typename ... Ts>
    struct adapter
    {
        static R invoke_no_fwd(Args... args)
        {
            C t((Ts::value)...);
            return (t.*F)(args...);
        }
    };
};

class Class
{
public:
    Class(const char* psz) {
        std::cout << psz << std::endl;
    }
    void print(int v)
    {
        std::cout << "Class: " << v << std::endl;
    }
};

struct X
{
	static const char* value;
};

const char* X::value = "ABC";

int main()
{
    typedef void(*function_t)(int);
    function_t ptrFunc = delegate<void, Class, int>::adapter<&Class::print, X>::invoke_no_fwd;
    ptrFunc(-42); // 0

    return 0;
}
