Вызов make_inc_array<10>()
возвращает make_inc_array_impl(std::make_integer_sequence<int, 10>{})
. std::make_integer_sequence
- шаблон псевдонима. В частности, оно реализовано так, что std::make_integer_sequence<int, 10>
является псевдонимом для типа std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
. Таким образом, когда make_inc_array_impl
вызывается с аргументом этого типа, Is...
выводится в 0 1 2 3 4 5 6 7 8 9
, чтобы сделать тип параметра std::integer_sequence<int, Is...>
равным типу аргумента. Наконец, этот пакет расширен в теле make_inc_array_impl
. Расширение пакета гарантированно происходит по порядку, поэтому оно становится 0 + 1
, 1 + 1
, ..., 9 + 1
.
Самая сложная часть этого - std::make_integer_sequence
. Как он расширяется до std::integer_sequence
специализации с фактическими желаемыми последовательными целыми числами? Ну, это было вставлено в стандартную библиотеку, так что вам не нужно помнить, как это сделать самостоятельно, но если вы хотите увидеть ответ, посмотрите здесь .
Как правило, вам нужна вспомогательная функция, которая вызывается с результатом std::make_integer_sequence<int, N>{}
, чтобы можно было поместить отдельные целые числа в последовательность, , т.е. пакет Is...
. Теперь, когда вы знаете об этой уловке, вы начнете видеть множество мест, где вы можете ее использовать.