为什么这个C ++递归模板不起作用?

时间:2013-04-18 14:05:32

标签: c++ templates recursion

我找到interesting question并决定详细检查最佳答案 我问自己为什么需要结构并尝试在没有它的情况下重写代码:

#include <iostream>
template <int N> void out(std::ostream& os) {
    out<N-1>(os);
    os << N << std::endl;
}

template <> void out<1>(std::ostream& os){
    os << 1 << std::endl;
}

int main(){
    out<100>(std::cout);
}

然后我尝试重构代码。 我有这样的事情:

#include <iostream>
template <int N> void out() {
    if (N != 1) {
        out<N-1>();
        std::cout << N << std::endl;
    }
    else {
        std::cout << 1 << std::endl;
    }
}

int main(){
    out<100>();
}

我不明白为什么这段代码不起作用 有什么想法吗?

2 个答案:

答案 0 :(得分:5)

问题是在运行时评估if条件。当您到达N = 1的实例化时,它不知道if语句的第一个块将不会执行。它继续实例化out<0>,依此类推。 If we had a static if,这是可能的,但it probably won't happen very soon

答案 1 :(得分:3)

模板在编译期间进行扩展,而if语句仅在运行时检查,这是一个不同的后期阶段。在您的情况下,编译器将尝试无限扩展,因为对于固定值N(以前是1)没有函数的特定实现。