Подтвердить что ты не робот

Как получить количество аргументов `std:: function`?

Возможно ли получить количество аргументов std::function? Что-то вроде NumOfArgument<...>::value.

Например, NumOfArgument<function<int(int, int)> >::value должно быть 2.

4b9b3361

Ответ 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;

Рабочая демонстрация

Он печатает измененное имя типов!