В качестве дополнения к ответу Петра Скотницкого я предлагаю C ++ 14 способ избежать рекурсивного print()
.
Не так элегантно, как решение C ++ 17, основанное на свертывании шаблонов, но в равной степени позволяет избежать использования рекурсии (и учтите, что рекурсия шаблона обычно строго ограничена компиляторами, поэтому рекурсивное решение работает, ноне когда N
превышает предел рекурсии).
Вы должны написать функцию printNumber()
как обычно, передав std::make_index_sequence<N>
(которая наследуется от std::index_sequence<0, 1, ...., N-1>
aka std::integer_sequence<std::size_t, 0, 1, ..., N-1>
) другой функции
template <std::size_t N>
void printNumbers ()
{ printNumbers2(std::make_index_sequence<N>{}); }
но в printNumbers2()
вы можете избежать вызова рекурсивного print()
и вы можете вызвать print()
, который фактически вызывает std::cout
внутри инициализации неиспользуемого массива
template <std::size_t ... Is>
void printNumbers2 (std::index_sequence<Is...>)
{
using unused = int[];
(void)unused { 0, (print(Is), 0)... };
}
Вы также можете избежать печати обеих функций print()
непосредственно в printNumbers2()
void printNumbers2 (std::index_sequence<Is...>)
{
using unused = int[];
(void)unused { 0, (std::cout << val << std::endl, 0)... };
}
Вы можете сделать то же самое в решениях свертывания шаблонов C ++ 17 / C ++ 20.
В C ++ 11 это решение не работает, а только потому, что std::make_integer_sequence
и std::index_sequence
введены из C ++ 11.
Если вы пишете суррогат C ++ 11для std::make_integer_sequence
и std::index_sequence
вы можете адаптировать это решение также к C ++ 11.