Я пытаюсь найти сумму квадратов с помощью шаблонов с переменными числами. Входные параметры - это числа, для которых необходимо вычислить сумму квадратов. Пример: foo (2, 3, 4) должно возвращать значение 27 (то есть 2+ (9 + 16))
Уже поздно играть?
В любом случае, если вы хотите найти сумму квадратов, foo(2, 3, 4)
должно вернуть 4+9+16 = 29
, а не 27
.
Я предлагаю нерекурсивную функцию, использующую оператор запятой в инициализации неиспользуемого целочисленного массива
template <typename T, typename ... Ts>
T foo (T const & t, Ts const & ... ts)
{
using unused = int[];
T ret { t*t };
(void)unused { 0, (ret += ts*ts, 0)... };
return ret;
}
С
std::cout << foo(2, 3, 4) << std::endl;
вы получите 29
Если вы можете использовать C ++ 17, вы можете использовать свертывание шаблона и foo()
просто станет
template <typename ... Ts>
auto foo (Ts const & ... ts)
{ return ( (ts*ts) + ... ); }