2013-04-18 2 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

브랜치가 런타임 구조이므로, 컴파일러는 행복하게''을 인스턴스화합니다 ... 전문화의 목적은 인스턴스화를 종료하는 것입니다. – Nim

답변

5

문제는 실행시에 if 조건이 평가된다는 것입니다. N = 1 인스 턴 스화에 도달하면 if 문의 첫 번째 블록이 실행되지 않는다는 것을 알지 못합니다. 그것은 out<0>을 인스턴스화하는 식으로 진행됩니다. If we had a static if이 가능하지만 it probably won't happen very soon입니다.

3

템플릿은 컴파일 중에 확장되며 if 문은 런타임 중에 다른 단계 인 if 만 검사됩니다. 귀하의 경우 컴파일러는 고정 값 N (즉, 1)에 대한 함수의 특정 구현이 없기 때문에 무기한 확장하려고 시도합니다.

관련 문제