Шаблон C ++ реализует l oop с рекурсией - PullRequest
3 голосов
/ 24 января 2020

Я пытаюсь написать мета-функцию с рекурсией. Входные данные представляют собой переменные целых чисел c, а выходные данные должны быть суммой входных данных.

Мой код выглядит следующим образом:

template <size_t curInput, size_t...Inputs>
constexpr size_t Accumulate = curInput + Accumulate<Inputs...>;

// template specialization
template <size_t...Inputs>
constexpr size_t Accumulate<Inputs> = 0;

int main(int argc, char *argv[]) {
  constexpr size_t res1 = Accumulate<1>;
  constexpr size_t res2 = Accumulate<1, 2, 3, 4, 5>;
  return 0;
}

При проверке в main(), res1 равно 0, а res2 равно 10. Похоже, обрабатывать последнее целое число как 0, я не понимаю, почему это произошло. И я хочу знать, как его изменить.

Любой ответ будет оценен по достоинству!

1 Ответ

3 голосов
/ 24 января 2020

Вашему рекурсивному шаблону требуется как минимум один параметр, он отбирает первый, а затем рекурсивный. Следовательно, ваша специализация должна быть в случае, когда существует ровно один параметр шаблона: то есть базовый вариант.

#include <iostream>

template <size_t curInput, size_t...Inputs>
constexpr size_t Accumulate = curInput + Accumulate<Inputs...>;

// template specialization
template <size_t curInput>
constexpr size_t Accumulate<curInput> = curInput;

int main(int argc, char *argv[]) {
  constexpr size_t res1 = Accumulate<1>;
  constexpr size_t res2 = Accumulate<1, 2, 3, 4, 5>;

  std::cout << res1 << " " << res2 << std::endl;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...