#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(int param) : m_val(param) {}
void print(int v) {
std::cout << "Class: " << v + m_val << std::endl;
}
private:
int m_val;
};
int main()
{
typedef void(*function_t)(int);
function_t ptrFunc = (delegate<void, Class, int>::adapter<&Class::print, std::integral_constant<int, 42> >::invoke_no_fwd);
auto type = (delegate<void, Class, int>::adapter<&Class::print, std::integral_constant<int, 42>>::invoke_no_fwd);
ptrFunc(-42); // 0
type(0); // 42
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgQywgdHlwZW5hbWUuLi4gQXJncz4KY2xhc3MgZGVsZWdhdGUKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTxSKEM6OipGKShBcmdzLi4uKSwgdHlwZW5hbWUgLi4uIFRzPgogICAgc3RydWN0IGFkYXB0ZXIgewogICAgICAgIHN0YXRpYyBSIGludm9rZV9ub19md2QoQXJncy4uLiBhcmdzKSB7CiAgICAgICAgICAgIEMgdChUczo6dmFsdWUuLi4pOwogICAgICAgICAgICByZXR1cm4gKHQuKkYpKGFyZ3MuLi4pOwogICAgICAgIH0KICAgIH07Cn07CgpjbGFzcyBDbGFzcwp7CnB1YmxpYzoKICAgIENsYXNzKGludCBwYXJhbSkgOiBtX3ZhbChwYXJhbSkge30KICAgIHZvaWQgcHJpbnQoaW50IHYpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNsYXNzOiAiIDw8IHYgKyBtX3ZhbCA8PCBzdGQ6OmVuZGw7CiAgICB9CnByaXZhdGU6CiAgICBpbnQgbV92YWw7Cn07CgppbnQgbWFpbigpCnsKICAgIHR5cGVkZWYgdm9pZCgqZnVuY3Rpb25fdCkoaW50KTsKICAgIGZ1bmN0aW9uX3QgcHRyRnVuYyA9IChkZWxlZ2F0ZTx2b2lkLCBDbGFzcywgaW50Pjo6YWRhcHRlcjwmQ2xhc3M6OnByaW50LCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgNDI+ID46Omludm9rZV9ub19md2QpOwogICAgYXV0byB0eXBlID0gKGRlbGVnYXRlPHZvaWQsIENsYXNzLCBpbnQ+OjphZGFwdGVyPCZDbGFzczo6cHJpbnQsIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCA0Mj4+OjppbnZva2Vfbm9fZndkKTsKICAgIHB0ckZ1bmMoLTQyKTsgLy8gMAogICAgdHlwZSgwKTsgICAgICAvLyA0MgogICAgcmV0dXJuIDA7Cn0K