我找到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>();
}
我不明白为什么这段代码不起作用 有什么想法吗?
答案 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
)没有函数的特定实现。