从维基百科中,我看到了一个用于阶乘计算的泛型编程示例,如下所示:
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 更好,如果第二个代码有陷阱怎么办。
当 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)