Как получить количество аргументов `std:: function`? Возможно ли получить количество аргументов std::function? Что-то вроде NumOfArgument<...>::value. Например, NumOfArgument<function<int(int, int)> >::value должно быть 2. Ответ 1 Я думаю, что std::function сам не предоставляет эту функцию. Но вы можете реализовать его сами, как: template<typename T> struct count_arg; template<typename R, typename ...Args> struct count_arg<std::function<R(Args...)>> { static const size_t value = sizeof...(Args); }; Тестовый код: typedef std::function<int(int, int)> fun; std::cout << count_arg<fun>::value << std::endl; //should print 2 Смотрите это: онлайн-демонстрация Аналогично, вы можете добавить в него больше функций, например: template<typename T> struct function_traits; //renamed it! 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; }; }; Теперь вы можете получить каждый тип аргумента, используя константный индекс, как: std::cout << typeid(function_traits<fun>::arg<0>::type).name() << std::endl; std::cout << typeid(function_traits<fun>::arg<1>::type).name() << std::endl; std::cout << typeid(function_traits<fun>::arg<2>::type).name() << std::endl; Рабочая демонстрация Он печатает измененное имя типов!
Ответ 1 Я думаю, что std::function сам не предоставляет эту функцию. Но вы можете реализовать его сами, как: template<typename T> struct count_arg; template<typename R, typename ...Args> struct count_arg<std::function<R(Args...)>> { static const size_t value = sizeof...(Args); }; Тестовый код: typedef std::function<int(int, int)> fun; std::cout << count_arg<fun>::value << std::endl; //should print 2 Смотрите это: онлайн-демонстрация Аналогично, вы можете добавить в него больше функций, например: template<typename T> struct function_traits; //renamed it! 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; }; }; Теперь вы можете получить каждый тип аргумента, используя константный индекс, как: std::cout << typeid(function_traits<fun>::arg<0>::type).name() << std::endl; std::cout << typeid(function_traits<fun>::arg<1>::type).name() << std::endl; std::cout << typeid(function_traits<fun>::arg<2>::type).name() << std::endl; Рабочая демонстрация Он печатает измененное имя типов!