我在这里找到了一个代码Printing 1 to 1000 without loop or conditionals

有人可以解释一下编译时间递归的工作原理,但在Google中找不到吗

// 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>();
}

谢谢!

最佳答案

它使用递减的f1<N>值重复实例化N模板(f1<N>()调用f1<N-1>等)。 N==1的显式专门化结束了递归:N变为1时,编译器将选择专门的函数,而不是模板化的函数。
f1<1000>()使编译器实例化f1<N> 999次(不计入对f1<1>的最终调用中)。这就是为什么要花一些时间来编译大量使用模板元编程技术的代码的原因。

整个过程严重依赖于编译器的优化技能-理想情况下,它应该完全删除递归(仅用作黑客使用模板来模拟for循环)。

关于c++ - 编译时间递归如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5274149/

10-13 06:14