You can achieve something close:
template<class ArgumentT, class ReturnT, class F, F f> struct A; template<class ArgumentT, class ReturnT, ReturnT (*f)()> struct A<ArgumentT, ReturnT, ReturnT (*)(), f> { // f is used somewhere. }; template<class ArgumentT, class ReturnT, class C, ReturnT (C::*f)()> struct A<ArgumentT, ReturnT, ReturnT (C::*)(), f> { // f is used somewhere. };
... but you cannot take something like std::function<ReturnT ()> as a template parameter of a non-pig type. Specialization for function pointers will also accept unassembled lambdas.
source share