#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;
}
};
static constexpr const char money[] = "money";
int main()
{
typedef void(*function_t)(int);
function_t ptrFunc =
delegate<void, Class, int>
::adapter<
&Class::print,
std::integral_constant<const char*, money> >::invoke_no_fwd;
auto type = delegate<void, Class, int>::
adapter<&Class::print, std::integral_constant<const char*, money>>::invoke_no_fwd;
ptrFunc(-42);
type(0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgQywgdHlwZW5hbWUuLi4gQXJncz4KY2xhc3MgZGVsZWdhdGUKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTxSKEM6OipGKShBcmdzLi4uKSwgdHlwZW5hbWUgLi4uIFRzPgogICAgc3RydWN0IGFkYXB0ZXIKICAgIHsKICAgICAgICBzdGF0aWMgUiBpbnZva2Vfbm9fZndkKEFyZ3MuLi4gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIEMgdCgoVHM6OnZhbHVlKS4uLik7CiAgICAgICAgICAgIHJldHVybiAodC4qRikoYXJncy4uLik7CiAgICAgICAgfQogICAgfTsKfTsKCmNsYXNzIENsYXNzCnsKcHVibGljOgogICAgQ2xhc3MoY29uc3QgY2hhciogcHN6KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHBzeiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICB2b2lkIHByaW50KGludCB2KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQ2xhc3M6ICIgPDwgdiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgbW9uZXlbXSA9ICJtb25leSI7CgppbnQgbWFpbigpCnsKICAgIHR5cGVkZWYgdm9pZCgqZnVuY3Rpb25fdCkoaW50KTsKICAgIGZ1bmN0aW9uX3QgcHRyRnVuYyA9CiAgICAgICAgZGVsZWdhdGU8dm9pZCwgQ2xhc3MsIGludD4KICAgICAgICAgICAgOjphZGFwdGVyPAogICAgICAgICAgICAgICAgJkNsYXNzOjpwcmludCwKICAgICAgICAgICAgICAgIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Y29uc3QgY2hhciosIG1vbmV5PiA+OjppbnZva2Vfbm9fZndkOwogICAgYXV0byB0eXBlID0gZGVsZWdhdGU8dm9pZCwgQ2xhc3MsIGludD46OgogICAgICAgIGFkYXB0ZXI8JkNsYXNzOjpwcmludCwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxjb25zdCBjaGFyKiwgbW9uZXk+Pjo6aW52b2tlX25vX2Z3ZDsKICAgIHB0ckZ1bmMoLTQyKTsKICAgIHR5cGUoMCk7CgogICAgcmV0dXJuIDA7Cn0K