Какой шаблон лучше использовать в факториале - PullRequest
5 голосов
/ 15 января 2020

Из википедии я вижу пример программирования c generic для факторных вычислений, как показано ниже:

template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};

и со своей стороны я написал код, подобный приведенному ниже:

template <typename T>
T factorial(T n)
{ 
  T x;

  if (n == 1)
    return 1;

  x = n * factorial(n-1);

  return x;
}

Я прочитал в stackoverflow, что enum - это то, что используется в программировании generi c, но не нашел аргументов по причинам.

Так почему лучше использовать enum и что, если во втором коде есть подводные камни.

1 Ответ

8 голосов
/ 15 января 2020

Первый требовался, когда функции constexpr еще не было. Перечисления были единственным способом сохранить значения, используемые во время компиляции, когда constexpr не существовало. В настоящее время вы можете реализовать те же вычисления на основе шаблонов, используя static constexpr вместо перечислений. Кроме того, первый тип не является c по типу, он предназначен только для int.

Второй тип c по типу использует шаблон, но выполняется только во время выполнения.

Из Конечно, шаблоны создаются во время компиляции, но созданный код является исполняемым только по умолчанию.

С помощью функции constexpr вы можете написать один и тот же код для времени выполнения и времени компиляции:

template <typename T>
constexpr T factorial(T n)
{ 
  T x{};

  if (n == 1)
    return 1;

  x = n * factorial(n-1);

  return x;
}

int main() {
    int compiletime[factorial(2)];

    int n;
    std::cin >> n;
    int runtime = factorial(n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...