说我有这段代码:
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;
};
这是一个用来计算阶乘的模板。它应该在编译时计算。 在编译时通过模板执行计算通常是合理的(特别是:更快)吗? 附:很抱歉,如果之前已经询问并回答过这个问题,我搜索了这个特殊问题并且只找到了类似问题。
答案 0 :(得分:4)
如果你可以在编译时计算一些东西,你应该这样做,除非这会使你的代码复杂化很多。通常,编译器会在编译时为您计算常量子表达式。但是,您显示的计算是不同的,因为它使用模板作为Turing-complete programming system。
这个特定的模板旨在提供一个如何在编译时计算某些东西的简单演示。该程序看起来非常像Prolog程序:它包含一个简单的基本案例和一个递归缩减步骤。这类程序的问题在于它们非常难以理解。虽然有些情况下编译时计算可以帮助您构建可靠的软件,但这些方法的适用性受到限制,因为它们会产生重大的维护责任。