- Функция
sum()
требуется здесь, чтобы я мог получить возвращаемое значение для void
, переданного при обработке последнего элемента с переменным числом. - Можно ли избежать написания этой функции sum()
и иметь такую же функциональность?
Каждая рекурсия нуждается в условии остановки. При типичном использовании рекурсии с шаблонами с переменными значениями (например, в этом коде) условие остановки является другой перегрузкой основного шаблона. Таким образом, вы не можете полностью избавиться от этого.
Конечно, вы можете заменить условие останова на другое. Возможно, этот, который также будет работать для суммирования вещей, которые не могут быть построены по умолчанию:
template <class T>
auto sum(T last) { return last; }
Конечно, есть и другие подходы к этому, чем рекурсивные вариационные шаблоны; такие подходы могут не нуждаться в состоянии остановки.
- Возвращение целого числа '0' из функции
sum()
ограничивает использование целого шаблона целыми числами. Могу ли я расширить этот же шаблон для объединения строк?
Нет, поскольку не шаблонная функция не знает, с каким типом имели дело предыдущие рекурсивные вызовы. Эту проблему можно решить с помощью условия остановки «последний элемент», которое я предложил выше.