#include <iostream>
using namespace std;
class Foo {
public:
void bar(int) { cout << "bar" << endl; }
};
template< class T, typename ...Args, void(T::*Member)(Args...) >
void member_dispatch(Args&&... args, void* userdata)
{
T* obj = static_cast<T*>(userdata);
(obj->*Member)(std::forward<Args>(args)...);
}
int main()
{
Foo foo;
member_dispatch<Foo, int, &Foo::bar>(1, &foo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEZvbyB7CnB1YmxpYzoKICAgIHZvaWQgYmFyKGludCkgeyBjb3V0IDw8ICJiYXIiIDw8IGVuZGw7IH0KfTsKCnRlbXBsYXRlPCBjbGFzcyBULCB0eXBlbmFtZSAuLi5BcmdzLCB2b2lkKFQ6OipNZW1iZXIpKEFyZ3MuLi4pID4Kdm9pZCBtZW1iZXJfZGlzcGF0Y2goQXJncyYmLi4uIGFyZ3MsIHZvaWQqIHVzZXJkYXRhKQp7CiAgICBUKiBvYmogPSBzdGF0aWNfY2FzdDxUKj4odXNlcmRhdGEpOwogICAgKG9iai0+Kk1lbWJlcikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKfQoKaW50IG1haW4oKQp7CiAgICBGb28gZm9vOwogICAgbWVtYmVyX2Rpc3BhdGNoPEZvbywgaW50LCAmRm9vOjpiYXI+KDEsICZmb28pOwogICAgcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:20:49: error: no matching function for call to ‘member_dispatch(int, Foo*)’
member_dispatch<Foo, int, &Foo::bar>(1, &foo);
^
prog.cpp:11:6: note: candidate: template<class T, class ... Args, void (T::* Member)(Args ...)> void member_dispatch(Args&& ..., void*)
void member_dispatch(Args&&... args, void* userdata)
^~~~~~~~~~~~~~~
prog.cpp:11:6: note: template argument deduction/substitution failed: