If you want to keep bar as a template argument, I'm afraid you can come close to this:
#include <cstdio> template<typename T> struct traits { }; template<typename R, typename A> struct traits<R(A)> { typedef R ret_type; typedef A arg_type; }; template <typename F, F* func> typename traits<F>::ret_type foo(typename traits<F>::arg_type t) { return func(t); } int bar(double j) { return (int)(j + 1); } int main() { printf("%d\n", foo<decltype(bar), bar>(7.3)); }
You can also define a macro if you want to avoid repeating the bar name:
#define FXN_ARG(f) decltype(f), f int main() { printf("%d\n", foo<FXN_ARG(bar)>(7.3)); }
Alternatively, you can let bar become an argument to a function, making your life easier:
#include <cstdio> template<typename T> struct traits { }; template<typename R, typename A> struct traits<R(A)> { typedef R ret_type; typedef A arg_type; }; template<typename R, typename A> struct traits<R(*)(A)> { typedef R ret_type; typedef A arg_type; }; template <typename F> typename traits<F>::ret_type foo(F f, typename traits<F>::arg_type t) { return f(t); } int bar(double j) { return (int)(j + 1); } int main() { printf("%d\n", foo(bar, 7.3)); }
source share