Я думаю, вы могли упустить момент, когда вы проходите через это в отладчике, вы каждый раз вводите совершенно другую функцию.
(Обратите внимание, что val1
не используется в "следующем" вызове , поэтому вы каждый раз передаете на один аргумент меньше.)
Если бы не было вариативных c шаблонов, вам нужно было бы указать их как отдельные шаблоны, но это было бы точно так же:
template <typename Res, typename T>
void Sum(Res& result, T val)
{
result += val;
}
template <typename Res, typename T1, typename T2>
void Sum(Res& result, T1 val1, T2 val2)
{
result += val1;
Sum(result, val2);
}
template <typename Res, typename T1, typename T2, typename T3>
void Sum(Res& result, T1 val1, T2 val2, T3 val3)
{
result += val1;
Sum(result, val2, val3);
}
template <typename Res, typename T1, typename T2, typename T3, typename T4>
void Sum(Res& result, T1 val1, T2 val2, T3 val3, T4 val4)
{
result += val1;
Sum(result, val2, val3, val4);
}
template <typename Res, typename T1, typename T2, typename T3, typename T5>
void Sum(Res& result, T1 val1, T2 val2, T3 val3, T4 val4, T5 val5)
{
...
и так далее, столько, сколько вам нужно.
Шаблон Variadi c заставляет компилятор генерировать все эти «по запросу» и избавляет вас от написания их всех вне.
Один из способов взглянуть на это состоит в том, что обычные шаблоны функций (только с параметрами типа) генерируют перегрузки с тем же количеством параметров; Шаблоныariadi c позволяют вам также создавать перегрузки с различным количеством параметров.
Прямой доступ невозможен, потому что вы не знаете, сколько элементов внутри пакета параметров, каковы их типы, и они не t имеют имена.
Если вы хотите получить доступ к указанному аргументу c, вам также необходимо сделать его явным.