Следующий код реализует шаблон функции foo
, который принимает произвольное количество аргументов и впоследствии обрабатывает каждый из них, сохраняя позиционный индекс этого аргумента:
template<int index, typename T>
void foo_impl(T value)
{
// Do something with index/value
}
template<int index, typename T, typename... Rest>
void foo_impl(T value, Rest... values)
{
// Do something with index/value
// Recursively handle remaining arguments
foo_impl<index + 1>(values...);
}
template<typename... T>
void foo(T... args)
{
foo_impl<1>(args...);
}
int main()
{
foo("test", 42);
}
Это рекурсивно создает шаблоны функций до он достигает базового шаблона, который принимает один аргумент. В каждом экземпляре шаблона функции foo_impl
пропущены аргументы типа шаблона. Хотя это компилируется с Clang, G CC и MSV C, я не уверен, что это допустимо.
Допустимо ли опускать аргументы шаблона, как показано в пример кода? Если да, то каковы конкретные правила c? И изменились ли эти правила между стандартами C ++?