Ваша проблема здесь в том, что sum<Rest...>()
, когда Rest
пусто, не будет вызывать int sum()
, потому что эта функция не является шаблоном.
Когда вы изменяете ее на
template<int first>
int sum { return first; }
, тогда возникает проблема, что template<int first> int sum
и template <int first, int ...Rest> int sum()
с Rest
пустым разрешением являются одной и той же функцией. Здесь нет правил о ie break, поэтому вы получите ошибку компилятора.
Старый способ исправить это состоял в том, чтобы просто добавить еще один параметр шаблона в шаблон variadi c, предоставив вам набор перегрузки
template <int first>
int sum() {
return 0;
}
template <int first, int second, int ...Rest>
int sum() {
return first + sum<second, Rest...>();
}
и с этим один раз Rest
пуст единственная жизнеспособная функция для вызова - template <int first> int sum()
Теперь, когда у нас есть выражения сгиба, это больше не нужно, и вы можете просто использовать
template <int... Vals>
int sum() {
static_assert(sizeof...(Vals) > 0, "You must provide at least one template parameter");
return (... + Vals);
}