2012-02-01 4 views
1

다음 템플릿 정의 및 템플릿 전문화 정의의 작동 방식을 이해하는 데 어려움이 있습니까? 나에게, factorial<34> 또는 factorial<T-1> 이상하게 보입니다! 예를 들어팩터얼 <T - 1>의 의미가 템플릿 정의

는 :

factorial<T - 1>::value 

무엇을 의미?

#include <iostream> 

template<int T> 
struct factorial { 
    enum { value = factorial<T - 1>::value * T }; 
}; 

template<> 
struct factorial<1> { 
    enum { value = 1 }; 
}; 

int main() 
{ 
    std::cout << factorial<34>::value << std::endl; 

}  

g++ -o testSTL01 testSTL01.cpp -Wall 
testSTL01.cpp: In instantiation of ‘factorial<13>’: 
testSTL01.cpp:5:3: instantiated from ‘factorial<14>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<15>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<16>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<17>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<18>’ 
testSTL01.cpp:5:3: [ skipping 11 instantiation contexts ] 
testSTL01.cpp:5:3: instantiated from ‘factorial<30>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<31>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<32>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<33>’ 
testSTL01.cpp:5:3: instantiated from ‘factorial<34>’ 
testSTL01.cpp:15:29: instantiated from here 
testSTL01.cpp:5:3: warning: integer overflow in expression 
start to run the app ... 

0 
+0

나에게 아주 간단 해 보입니다. 어떤 부분을 이해하지 못합니까? – Mankarse

+2

아마도 사람들은 * 유형 * 매개 변수 만있는 템플릿을 통해 템플릿에 소개되기 때문일 수 있습니다. 제 생각에 그것은 일부 사람들에게는 새롭고 이상한 가치 매개 변수의 아이디어 일 뿐이라고 생각합니다. –

+0

무엇이 문제입니까? –

답변

6

이것은 템플릿 메타 프로그래밍의 예입니다. 이 프로그램은 재귀를 사용하여 컴파일시 계승을 계산합니다. 재귀의 기본은 여기에 있습니다 :

template<> 
struct factorial<1> { 
    enum { value = 1 }; 
}; 

그것은 하나의 요인은 숫자의 계승은 그 횟수 계승 1을 뺀

template<int T> 
struct factorial { 
    enum { value = factorial<T - 1>::value * T }; 
}; 
것을 다른 템플릿은 단순히 말한다 1.

것을 말한다

고전적인 의미에서 실제로 "호출"이 없으므로 템플릿은 컴파일시 계산 된 T-1과 같은 템플릿 인수를 사용하여 자체를 인스턴스화합니다.

P. 경고는 팩토리얼이 32 비트 정수를 오버플로한다는 것을 보여줍니다.

+0

'int'는 32 비트라고 가정합니다. 그것은 중요하지 않습니다. 계산은 64 비트 정수를 오버플로합니다. –

+2

@DonalFellows :'int'는 13 비트이기 때문에 32 비트입니다! 그 오버 플로우. –

5

정말 질문이 아닙니다. 진술입니다. 템플릿 인수는 이 아니기 때문에이 형식이 될 수 있지만, 대개의 경우 유형이므로 이전에 형식이 아닌 템플릿 인수를 보지 못했을 수 있습니다.

즉, factorial<1>은 전문화 (value=1)를 사용하고 factorial<N>의 N> 1은 일반 사례 (factorial<N-1> 참조)를 사용합니다. 이는 팩토리얼에 대한 컴파일 타임 평가를 제공합니다 (템플릿이 반복적으로 확장되므로).

하지만 34의 계승이 얼마나 큰지 알 수 있습니까? 정수에 맞출 것으로 기대하십니까? (답변 : 295232799039604140847618609643520000000 및 아니오).

관련 문제