Вы получаете ошибку, потому что единственная перегрузка sum
, которая принимает более одного аргумента, ожидает, что первый аргумент будет объектом принтера. Поскольку вы хотите печатать только один раз, самым чистым подходом было бы полностью разделить суммирование на его собственную функцию:
template <typename T>
double sum_impl(T t)
{
return t;
}
template <typename T, typename... Rest>
double sum_impl(T t, Rest... rest)
{
return t + sum(rest...);
}
, а затем использовать это в sum
template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
printer.print();
return sum_impl(t, rest...);
}