Сумма квадратов с использованием вариадических шаблонов - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь найти сумму квадратов, используя вариадические шаблоны.Входные параметры - это числа, для которых необходимо вычислить сумму квадратов.Пример: foo(2, 3, 4) должен возвращать значение 27 (то есть 2+(9+16)).Моя шаблонная функция выглядит следующим образом:

template<typename T>
T foo(T args)
{
    return args*args;
}

template <typename T, typename... A>
T foo(T first, A... args)
{
    return first+foo(pow(args,2)...);
}

Однако результат этой функции, похоже, равен 261, что оказалось не таким, как я ожидал.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Чтобы достичь результата, которого вы ожидаете в своем описании, вам нужно будет захватить «первое» в одной функции и выполнить повторение с отдельной, как это:

template<typename T>
T bar(T first) {
    return first*first;
}    

template<typename T, typename... A>
T bar(T first, A... args) {
    return bar(first) + bar(args...);
}    

template<typename T, typename... A>
T foo(T first, A... args) {
    return first + bar(args...);
}

Если вместо этого вы хотите возвести в квадраткаждый параметр в вашей функции и суммировать их следует следующим образом:

template<typename T>
T foo(T first) {
    return first*first;
}

template<typename T, typename... A>
T foo(T first, A... args) {
    return foo(first) + foo(args...);
}
0 голосов
/ 25 апреля 2018

Я пытаюсь найти сумму квадратов с помощью шаблонов с переменными числами. Входные параметры - это числа, для которых необходимо вычислить сумму квадратов. Пример: 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) + ... ); }
0 голосов
/ 25 апреля 2018

Краткий ответ: 2 + 9 + 256 = 267

Давайте расширим это:

foo(2, 3, 4) => 2 + foo(pow(args, 2)...)
             => 2 + foo(pow(3, 2), pow(4, 2))
             => 2 + foo(9, 16)
             => 2 + (9 + foo(16))
             => 2 + (9 + 16 * 16)
             => 267
Hello world!

Если вы хотите сделать это правильно, не pow() одно значение несколько раз:

template <typename T>
T foo(T arg)
{
    return arg * arg;
}

template <typename T, typename... A>
T foo(T first, A... args)
{
    return first * first + foo(args...);
    //     ^^^^^^^^^^^^^ or pow(first, 2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...