2017-09-18 2 views
4

내가 루프 또는 재귀 함수 호출없이 1000 (1)를 출력하는 프로그램을 작성하려고 시도하고, 나는 문제는이템플릿 클래스를 특수화 하시겠습니까?

#include <iostream> 

template <int N> 
class NumberGenerator : public NumberGenerator<N-1>{ 
    public: 
    NumberGenerator(); 
}; 

template <int N> 
NumberGenerator<N>::NumberGenerator(){ 
    // Let it implicitly call NumberGenerator<N-1>::NumberGenerator() 
    std::cout << N << std::endl; 
} 

template <> 
NumberGenerator<1>::NumberGenerator(){ 
    // How do I stop the implicit call? 
    std::cout << 1 << std::endl; 
} 

int main(){ 
    NumberGenerator<1000> a; // Automatically calls the constructor 
    return 0; 
} 

을 마련, 난 여전히 (NumberGenerator<1>를 체인 호출을 멈출 수 없다 NumberGenerator<0>에 전화를 걸었고 무한히 언더 플로우). 체인을 1시에 멈추게하려면 어떻게해야합니까?

template <int N> 
class NumberGenerator : public NumberGenerator<N-1>{ 
    public: 
    NumberGenerator(); 
}; 

template <> 
class NumberGenerator<1> { 
    public: 
    NumberGenerator(); 
}; 

답변

3

는 클래스 템플릿 자체를 전문화? 나는. `NG :: foo()`는`NG <1>`을 포함합니까?
+0

내가'NG <1>'에 특화되지 않은 클래스에서 다른 기능을 사용할 수 있습니다 : – iBug

+0

Erm. 희망이 도움이 될까요? http://coliru.stacked-crooked.com/a/dabc1b56b56e3848 – sehe

+0

다른 어떤 기능도 사용할 수 없습니다. 체인을 중지하려면 반드시 기본 클래스를 제거해야합니다. 템플릿 이외의 다른 방법은 없습니다. template meta 프로그래밍 (행운을 빌어 요) 2. 클래스 템플릿 전문 – sehe