2013-05-26 10 views
6
template <int N> 
struct Factorial { 
    enum { value = N * Factorial<N - 1>::value }; 
}; 

template <> 
struct Factorial<0> { 
    enum { value = 1 }; 
}; 


const int x = Factorial<4>::value; // == 24 
const int y = Factorial<0>::value; // == 1 

预编译后,如果我们能奇迹般地看到编译器产生什么样,我们将真正看到:这个模板创建的实际源代码是什么样的?

const int x = 24; 
const int y = 1; 

,我们将看到实际定义为struct Factorial,这些多重?如果是这样,他们将如何看待?我试图围绕元编程过程的这一部分进行研究。

+0

'阶乘<901> :: value'坠毁我的DEV-C++:错误:模板实例化深度超过了最大值900 – johnchen902

回答

1

在此代码中使用g++ -fdump-tree-original,我看到下面的结果,这种情况似乎也印证了您的猜疑:

;; Function int main() (null) 
;; enabled by -tree-original 



{ 
    const int x = 24; 
    const int y = 1; 

    <<cleanup_point const int x = 24;>>; 
    <<cleanup_point const int y = 1;>>; 
} 
return <retval> = 0; 
+0

有意思,并且根本没有为'struct Factorial'生成的代码? – johnbakers

+0

为什么'y'在'x'之后被清理干净?不应该破坏销毁顺序吗? – greatwolf

+0

@Fellowshee,你期望生成什么样的代码?它里面没有需要空间的静态变量,也没有需要代码的函数,也没有任何有史以来建立的结构的实例。编译器需要做的就是评估哪个枚举值被引用,这在编译时可以轻松完成。 在此阶段之前,会进行扩展,从逻辑上将Factorial <24>的定义降至因子<0>,但这些不会生成任何代码并且不再需要。 –