Это является продолжение на How do I get the argument types of a function pointer in a variadic template class?Используя неконстантное выражение в качестве параметра шаблона
Я имею эту структуру, чтобы получить доступ аргументов в VARIADIC шаблона:
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;
};
};
И доступ к типу аргумента of 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;
}
Спасибо @ Mike. Я решил, что он должен быть рекурсивным и во время компиляции мне просто не удалось собрать его;) НО: 'fun' неизвестно в области. Я попытался передать 'fun' в качестве параметра шаблона, но в специализации компилятор жалуется, что« функция частичной специализации шаблона »печатает <0, fun>« не разрешено ». Моя специализация гласит: 'template void print <0,fun>() {}' –
steffen
@steffen: Нет, вы не можете частично специализировать шаблоны функций, только шаблоны классов. Думаю, вам нужно будет обернуть функции в классах; Я обновлю ответ. –
Красивое, идеальное решение! Спасибо! – steffen