#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;
    }
};

template <char... Chars>
struct MyString
{
	static constexpr char value[] = { Chars..., '\0' };
};

template <char... Chars>
constexpr char MyString<Chars...>::value[];

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

    return 0;
}
