template<class T>struct tag{using type=T;}; template<class Tag>using type=typename Tag::type; template<class T, class Sig> struct member_function_pointer; template<class T, class Sig> using member_function_pointer_t=type<member_function_pointer<T,Sig>>; template<class T, class R, class...Args> struct member_function_pointer<T, R(Args...)>: tag<R(T::*)(Args...)> {};
then
template<class T, class Sig, member_function_pointer_t<T,Sig> mf> class C{};
gotta do the trick. If you need access to Args... you can specialize.
template<class T, class Sig, member_function_pointer_t<T,Sig> mf> class C; template<class T, class R, class...Args, member_function_pointer_t<T,R(Args...)> mf> class C<T, R(Args...), mf> { };
.
source share