#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgQywgdHlwZW5hbWUuLi4gQXJncz4KY2xhc3MgZGVsZWdhdGUKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTxSKEM6OipGKShBcmdzLi4uKSwgdHlwZW5hbWUgLi4uIFRzPgogICAgc3RydWN0IGFkYXB0ZXIKICAgIHsKICAgICAgICBzdGF0aWMgUiBpbnZva2Vfbm9fZndkKEFyZ3MuLi4gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIEMgdCgoVHM6OnZhbHVlKS4uLik7CiAgICAgICAgICAgIHJldHVybiAodC4qRikoYXJncy4uLik7CiAgICAgICAgfQogICAgfTsKfTsKCmNsYXNzIENsYXNzCnsKcHVibGljOgogICAgQ2xhc3MoY29uc3QgY2hhciogcHN6KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHBzeiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICB2b2lkIHByaW50KGludCB2KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ2xhc3M6ICIgPDwgdiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2hhci4uLiBDaGFycz4Kc3RydWN0IE15U3RyaW5nCnsKCXN0YXRpYyBjb25zdGV4cHIgY2hhciB2YWx1ZVtdID0geyBDaGFycy4uLiwgJ1wwJyB9Owp9OwoKdGVtcGxhdGUgPGNoYXIuLi4gQ2hhcnM+CmNvbnN0ZXhwciBjaGFyIE15U3RyaW5nPENoYXJzLi4uPjo6dmFsdWVbXTsKCmludCBtYWluKCkKewogICAgdHlwZWRlZiB2b2lkKCpmdW5jdGlvbl90KShpbnQpOwogICAgZnVuY3Rpb25fdCBwdHJGdW5jID0gZGVsZWdhdGU8dm9pZCwgQ2xhc3MsIGludD46OmFkYXB0ZXI8JkNsYXNzOjpwcmludCwgTXlTdHJpbmc8J0EnLCAnQicsICdDJz4+OjppbnZva2Vfbm9fZndkOwogICAgcHRyRnVuYygtNDIpOyAvLyAwCgogICAgcmV0dXJuIDA7Cn0K