Использование неконстантного выражения в качестве параметра шаблона - PullRequest
3 голосов
/ 31 января 2012

Это продолжение Как получить типы аргументов указателя функции в классе шаблона с переменным числом аргументов?

У меня есть эта структура для доступа к аргументам шаблона с переменным числом аргументов:

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;
    };
};

И я получаю доступ к типу аргумента Args с помощью

typedef function<void(Args...)> fun;
std::cout << std::is_same<int, typename function_traits<fun>::template arg<0>::type>::value << std::endl;

Однако я хотел бы перебрать аргументы, чтобы иметь возможность обрабатывать произвольное количество аргументов,Следующее не работает, но для иллюстрации того, что я хочу:

for (int i = 0; i < typename function_traits<fun>::nargs ; i++){ 
    std::cout << std::is_same<int, typename function_traits<fun>::template arg<i>::type>::value << std::endl;
}

1 Ответ

5 голосов
/ 31 января 2012

Вам нужно будет выполнить итерацию во время компиляции в соответствии с

template <typename fun, size_t i> struct print_helper {
    static void print() {
        print_helper<fun, i-1>::print();
        std::cout << std::is_same<int, typename function_traits<fun>::template arg<i-1>::type>::value << std::endl;
    }
};

template <typename fun> struct print_helper<fun,0> {
    static void print() {}
};

template <typename fun> void print() {
    print_helper<fun, function_traits<fun>::nargs>::print();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...