什么模板使用在阶乘中更好

Blo*_*aRd 5 c++ templates

从维基百科中,我看到了一个用于阶乘计算的泛型编程示例,如下所示:

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

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};
Run Code Online (Sandbox Code Playgroud)

在我这边,我写了如下代码:

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

  if (n == 1)
    return 1;

  x = n * factorial(n-1);

  return x;
}
Run Code Online (Sandbox Code Playgroud)

我在 stackoverflow 中读到 enum 是泛型编程中使用的,但由于原因没有找到参数。

那么为什么使用 enum 更好,如果第二个代码有陷阱怎么办。

Gui*_*cot 8

当 constexpr 函数还不存在时,第一个是必需的。枚举是在编译时存储constexpr不存在的可用值的唯一方法。如今,您可以使用static constexpr而不是枚举来实现相同的基于模板的计算。此外,第一个不是按类型通用的,它int仅适用于。

第二个是使用模板的类型泛型,但仅在运行时执行。

当然,模板是在编译时实例化的,但默认情况下实例化的代码只是运行时。

使用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);
}
Run Code Online (Sandbox Code Playgroud)