Я вижу четыре проблемы в вашем коде
(1) рекурсивный вызов
Print<n_next..., ts...>(ts...);
неверен, потому что вы должны использовать Ts...
типы в списке аргументов шаблона, а не ts...
значения
Print<n_next..., Ts...>(ts...);
или, что лучше (потому что разрешить трюк, который я объясню далее) без объяснения типов
Print<n_next...>(ts...);
(2) лучше, если вы получите как const ссылается на значения
template <unsigned int n, unsigned int ...n_next,
typename T, typename ...Ts>
void Print(T const & t, Ts ... ts)
// ..........^^^^^
, иначе вы не можете вызвать Print()
с постоянными значениями следующим образом
Print<1u, 3u>(1, "world");
(3) лучше использовать значение без знака для индексов в for
циклы, потому что вы должны проверить их со значениями без знака (незначительная проблема)
// ..VVVVVVVV
for (unsigned int i = 0; i < n; i++)
(4) вы должны поместить наземный регистр для Print()
(тот, который получает только значение) перед рекурсивный случай.
Я предлагаю заменить их на
template <typename = void>
void Print ()
{ }
, потому что, таким образом, все распечатки выполняются в рекурсивной версии и вам не нужно повторять одинаковый кодв двух разных функциях (но вы должны вызвать Print<n_next...>(ts...);
рекурсию.
Так что я поддерживаюose, чтобы изменить ваш код следующим образом
#include <iostream>
template <typename = void>
void Print ()
{ }
template <unsigned int n, unsigned int ...n_next,
typename T, typename ...Ts>
void Print(T const & t, Ts ... ts)
{
for(auto i = 0u; i < n; i++)
{
std::cout << t << " ";
}
std::cout << std::endl;
Print<n_next...>(ts...);
}
int main ()
{
Print<1u, 3u>("hello", "world");
}