#include <iostream>
int function (int arg) { return arg; }
typedef int (*function_t) (int arg);
template <typename T>
class caller {};
template <typename T_ret, typename... T_args>
class caller<T_ret(*)(T_args...)> {
T_ret (*m_p) (T_args... args);
public:
T_ret call (T_args... args) {
return m_p(args...);
}
caller (T_ret (*p)(T_args...args)) : m_p(p) {}
};
int main()
{
caller<decltype(&function)> c(&function);
std::cout << c.call(1) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IGZ1bmN0aW9uIChpbnQgYXJnKSB7IHJldHVybiBhcmc7IH0KdHlwZWRlZiBpbnQgKCpmdW5jdGlvbl90KSAoaW50IGFyZyk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCmNsYXNzIGNhbGxlciB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUX3JldCwgdHlwZW5hbWUuLi4gVF9hcmdzPiAKY2xhc3MgY2FsbGVyPFRfcmV0KCopKFRfYXJncy4uLik+IHsKICAgIFRfcmV0ICgqbV9wKSAoVF9hcmdzLi4uIGFyZ3MpOwpwdWJsaWM6CiAgICBUX3JldCBjYWxsIChUX2FyZ3MuLi4gYXJncykgewogICAgICAgIHJldHVybiBtX3AoYXJncy4uLik7CiAgICB9CiAgICBjYWxsZXIgKFRfcmV0ICgqcCkoVF9hcmdzLi4uYXJncykpIDogbV9wKHApIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIGNhbGxlcjxkZWNsdHlwZSgmZnVuY3Rpb24pPiBjKCZmdW5jdGlvbik7CiAgICBzdGQ6OmNvdXQgPDwgYy5jYWxsKDEpIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9Cg==