2013-04-18 56 views
0

我发现interesting question并决定详细检查最佳答案。
我问自己,为什么需要有结构,并试图重写了代码,没有它:为什么这个C++递归模板不起作用?

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

我不明白为什么这个代码不工作。
任何想法?

+4

该分支是一个运行时构造,编译器会高兴地实例化'out '这将继续...专业化的全部目的是终止实例。 – Nim

回答

5

问题是在运行时评估if条件。当你开始实例化N = 1时,它不知道if语句的第一个块将不会执行。它继续实例化out<0>等。这可能,但it probably won't happen very soon

3

模板在编译过程中展开,而语句只在运行时检查,这是不同的后期阶段。在你的情况下,编译器会尝试扩展,因为没有固定值N的函数的具体实现(曾经是1)。