Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板阶乘计算_C++_Templates_Template Meta Programming - Fatal编程技术网

C++ C++;模板阶乘计算

C++ C++;模板阶乘计算,c++,templates,template-meta-programming,C++,Templates,Template Meta Programming,假设我有这个代码: template <int n> class Factorial { public: static const int f = Factorial<n-1>::f*n; }; template<> class Factorial<0> { public: static const int f =1; }; 模板 类阶乘 { 公众: 静态常量int f=阶乘::f*n; }; 模板

假设我有这个代码:

template <int n>
class Factorial
{
    public:
        static const int f = Factorial<n-1>::f*n;
};
template<>
class Factorial<0>
{
    public:
        static const int f =1;
};
模板
类阶乘
{
公众:
静态常量int f=阶乘::f*n;
};
模板
类阶乘
{
公众:
静态常数int f=1;
};
这是一个用来计算阶乘的模板。它应该在编译时计算。 在编译时通过模板执行计算通常合理(特别是更快)吗?
请注意,如果以前有人问过并回答过这个问题,我搜索了这个特殊的问题,只找到了类似的问题。

如果您可以在编译时计算一些东西,您应该这样做,除非这会使代码复杂化很多。通常,编译器会在编译时为您计算常量子表达式。但是,您显示的计算是不同的,因为它使用模板作为一个模板


这个特定的模板旨在提供一个如何在编译时计算某些内容的简单演示。这个程序看起来很像一个Prolog程序:它由一个简单的基本情况和一个递归的简化步骤组成。这类程序的问题在于它们非常难以理解。虽然在某些情况下,编译时计算可以帮助您构建可靠的软件,但这些方法的适用性是有限的,因为它们会产生大量的维护责任。

您希望在编译时计算哪些内容?许多有价值的计算在一开始就太复杂,无法使用模板。您的
阶乘
类不正确。如果使用当前编译器,使用
constexpr
函数可以更轻松地完成此类计算。作为一项规则,这也避免了您经常从深度递归TMP中获得的极慢的编译时间。是的,constexpr更具可读性:
constexpr int factorial(int i){返回i,使用64位无符号整数类型,您可以计算20!而不是一位。不值得这样做。只需预先计算一个小表一次(或从互联网上盗用)。目前,我正在编写的代码很可能会被大量评论,也可能会被我和我自己阅读,这使我能够使用各种深奥的技术。话虽如此,感谢您提供的通用编码风格/可维护性建议。