#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgQywgdHlwZW5hbWUuLi4gQXJncz4KY2xhc3MgZGVsZWdhdGUKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTxSKEM6OipGKShBcmdzLi4uKSwgdHlwZW5hbWUgLi4uIFRzPgogICAgc3RydWN0IGFkYXB0ZXIKICAgIHsKICAgICAgICBzdGF0aWMgUiBpbnZva2Vfbm9fZndkKEFyZ3MuLi4gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIEMgdCgoVHM6OnZhbHVlKS4uLik7CiAgICAgICAgICAgIHJldHVybiAodC4qRikoYXJncy4uLik7CiAgICAgICAgfQogICAgfTsKfTsKCmNsYXNzIENsYXNzCnsKcHVibGljOgogICAgQ2xhc3MoY29uc3QgY2hhciogcHN6KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHBzeiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICB2b2lkIHByaW50KGludCB2KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ2xhc3M6ICIgPDwgdiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpzdHJ1Y3QgWAp7CglzdGF0aWMgY29uc3QgY2hhciogdmFsdWU7Cn07Cgpjb25zdCBjaGFyKiBYOjp2YWx1ZSA9ICJBQkMiOwoKaW50IG1haW4oKQp7CiAgICB0eXBlZGVmIHZvaWQoKmZ1bmN0aW9uX3QpKGludCk7CiAgICBmdW5jdGlvbl90IHB0ckZ1bmMgPSBkZWxlZ2F0ZTx2b2lkLCBDbGFzcywgaW50Pjo6YWRhcHRlcjwmQ2xhc3M6OnByaW50LCBYPjo6aW52b2tlX25vX2Z3ZDsKICAgIHB0ckZ1bmMoLTQyKTsgLy8gMAoKICAgIHJldHVybiAwOwp9Cg==