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

What template usage is better in factorial

本文关键字:阶乘 更好 用法 什么      更新时间:2023-10-16

从维基百科中,我看到了一个用于因子计算的通用编程示例,如下所示:

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;
}

我在堆栈溢出中读到枚举是泛型编程中使用的枚举,但没有找到原因的参数。

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

当 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);
}