编译时递归如何工作?

Vex*_*toR 21 c++ compile-time

我在这里找到了一个代码打印1到1000没有循环或条件

有人可以解释编译时间递归是如何工作的,无法在谷歌中找到它

// compile time recursion
template<int N> void f1()
{ 
    f1<N-1>(); 
    cout << N << '\n'; 
}

template<> void f1<1>() 
{ 
    cout << 1 << '\n'; 
}


int main()
{
    f1<1000>();
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ale*_*ler 12

它重复实例化f1<N>模板,减少N(f1<N>()调用f1<N-1>等)的值.N==1结束递归的显式特化:一旦N变为1,编译器将选择专用函数而不是模板化函数.

f1<1000>()导致编译器实例化f1<N>999次(不计入最后的调用f1<1>).这就是为什么编译大量使用模板元编程技术的代码需要一段时间的原因.

整个过程在很大程度上依赖于编译器的优化技能 - 理想情况下,它应该完全取消递归(仅用作模拟for使用模板的循环的hack ).