要获取函数类型,可以使用偏特化:
template <typename T>
struct Detect;
template <typename F>
struct Detect<std::function<F>> {
typedef F Result;
};
现在,当您获得未知std::function<?>
类型T
时,只需使用
typename Detect<T>::Result
(您可能希望定义Result
为F *
,因为某些上下文(例如,字段类型)仅允许指向函数的指针,而不是裸函数类型。
编辑:
要专注于参数的数量和第一个参数的类型,您需要 C++11 可变参数模板
template <typename T>
struct Detect;
template <typename R, typename A, typename... As>
struct Detect<std::function<R(A,As...)>> {
static constexpr auto numargs = 1 + sizeof...(As);
typedef R Result;
typedef A FirstArg;
};
或编写与上述等效的代码,对每个可能的参数数量使用单独的特化:
template <typename R, typename A1>
struct Detect<std::function<R(A1)>> {
enum { numargs = 1 };
typedef R Result;
typedef A1 FirstArg;
};
template <typename R, typename A1, typename A2>
struct Detect<std::function<R(A1,A2)>> {
enum { numargs = 2 };
...
};
...