什么模板用法在阶乘中更好
What template usage is better in factorial
从维基百科中,我看到了一个用于因子计算的通用编程示例,如下所示:
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);
}
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 在 C++ 中的数组上使用阶乘函数
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 阶乘问题在 c++ 中给出错误的输出
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 大数的阶乘给出错误的输出
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?