Вы можете написать function_traits
класс, как показано ниже, чтобы узнать типы аргументов, тип возвращаемого значения и количество аргументов:
template<typename T>
struct function_traits;
template<typename R, typename ...Args>
struct function_traits<std::function<R(Args...)>>
{
static const size_t nargs = sizeof...(Args);
typedef R result_type;
template <size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
};
};
Тестовый код:
struct R{};
struct A{};
struct B{};
int main()
{
typedef std::function<R(A,B)> fun;
std::cout << std::is_same<R, function_traits<fun>::result_type>::value << std::endl;
std::cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << std::endl;
std::cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << std::endl;
}
Демо: http://ideone.com/YeN29