template <typename T[, .... ]> 와 같은 형식으로 선언하며
T형을 쓰게되는 함수를 템플릿으로 하게 됩니다.
T Add(T a,T b)
{
return a+b;
}
T는 사용자가 지정하는 이름입니다.
이T의 자료형은 실행시에 결정됩니다.
호출은 함수호출과 마찬가지 입니다.
STL = Standard Templeate Library 템플릿으로 표현된 표준 라이브럴
템플릿을 특수화
템플릿은 런타임에서 호출될 때마다 그때 형이 결정된다.
이중 지정된 자료형인경우 함수명이 같은 다른 함수를 호출하여 처리되개 할수 있다
이것을 템플릿을 특수화라 한다.
우선 템플릿으로 사용할 함수를 선언,정의하고
지정한 자료형에 따른 함수를 선언,정의하기 전에
templat <>
함수 선언,정의를
하게 되면 인수가 선언한 자료형에 속하게되면 이 함수가 처리되개 된다.
template <typename T>
int Add(T a,T b)
{
return a+b;
}
template <>
int Add(int a,int b)
{
return a+b+10;
}
클래스 탬플릿도 함수 탬플릿과 같은 방법으로 정의,선언하면 되며
원하는 자료형만 바꿔주면 된다.
클래스의 선언과 정의 분리시에
정의 부분에 사용시에 클래스 탬플릿은 다음과 같이 사용한ㄷ
클래스명<템플릿자료형>
test<T>
이때
멤버함수를 템플릿에서 정의된 형으로 했다고 할때
클래스 생성 순서에 따라(메모리 확보- 생성자 호출)서 처리되면
형이 아직 결정이 되지 않기 때문에 메모리 확보를 할수가 없다
이럴때는 해당 템플릿 클래스 자료형 생성시에 자료형을 지정해준다.
템플릿 클래스명<자료형> 변수명;
test<int> aa;
test라는 템플릿 클래스의 개체를 생성하며
메모리 확보시 템플릿 자료형은 int 형으로 한다.
변수명은 aa이다.
템플릿 선언의 유효범위는
바로 아래의 요소의 블럭이 끝나는 부분까지이다.
따라서 클래스의 선언과 정의를 분리할때는
정의 부분에도 똑같은 템플릿 선언을 또 해주어야 한다.
템플릿은 그냥 틀에 지나지 않는다.
컴파일타임에 그엠 맞는 코드가 각각 생성이 된다.