{
return a+b;
}
T add(T a, T b) //대상을 템플릿으로 선언한다.
{
return a+b;
}
template <typename T> == template <class T>
같은 의미이다 그러나 과거에 주로 사용되던 방식이 후자이다.
T는 자료형을 결정짓지 않겠다는 의미로 사용된것이다.
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
T Add(T a, T b){
return a+b;
}
int main(){
cout<<Add(10,20)<<endl;
cout<<Add(1.1,2.2)<<endl;
return 0;
}
첫번째 Add함수 호출시에는 전달되는 인자가 int형 데이터이다 .이런경우 템플릿으로 정의되어
있는 Add함수의 T는 int로 인식이 된다.
두번째 Add함수 호출시에는 double형이기때문에 double로 인식된다.
템플릿으로 정의된 함수의 자료형이 결정되는 시점은 인자가 전달되는 순간이다.
2. 함수 템플릿
둘이상의 타입에 대해 템플릿화 하기
template <typename T1,typename T2> //함수 템플릿 정의
T1과T2라는 이름에 대해 다음에 정의하는 대상을 템플릿으로 선언한다. 라는 의미.
함수템플릿의 특수화
template <> //함수 템플릿의 특수화 선언
template <typename T>
int sizeOf(T a){
return sizeof(a);
}
template<>
int sizeOf(char* a){
return strlen(a);
}
int main(){
int i=10;
double e=7.7;
char* str="Good Morning";
cout<<sizeOf(i)<<endl;
cout<<sizeOf(e)<<endl;
cout<<sizeOf(str)<<endl;
return 0;
}
템플릿의 특수화 선언이다. 보통 한줄로 붙여서쓴다
template<> int sizeOf(char* a)
template<> int sizeOf<>(char* a)
template<> int sizeOf<char*>(char* a)
모두 같은의미 이므로 다 알아둘것.
클래스 템플릿
class Data{
T data;
public:
Data(T d){
data=d;
}
void SetData(T d){
data=d;
}
T GetData(){
return data;
}
};
template 다음에 정의하는 대상을 T라는 이름에 대해서 템플릿화 하겠다.
클래스 템플릿의 개체를 생성할때는
Data dd(10); 이 아니라 Data<int> dd(10); 으로 해주어야 한다.
객체는 1)메모리공간 할당 2)생성자 호출의 순으로 생성이 되는데 Data dd(10)을 하면 T의 자료형
이 무엇인지 모르기 때문에 메모리 공간의 할당을 얼만큼 해줘야 하는지 모른다.그렇기때문에
객체를 생성할때 명시적으로 선언을 해주어야 한다. Data<int> dd(10);
클래스 템플릿의 선언과 정의 분리
template <typename T>
class Data{
T data;
public:
Data(T d);
void SetData(T d);
T GetData();
};
template <typename T>
Data<T>::Data(T d){
data=d;
}
template <typename T>
void Data<T>::SetData(T d){
data=d;
}
template <typename T>
T Data<T>::GetData(){
return data;
}
Data<T>::Data(T d)
typename T로 정의된 템플릿의 생성자 및 멤버함수를 정의하는것이다.
Data::Data(T d) 와는 엄연히 다르다. 이것은 Data클래스의 정의이고
Data<T>::Data(T d)는 Data 클래스 템플릿의 정의이다.
4. 템플릿의 원리 이해
T add(T a, T b) //대상을 템플릿으로 선언한다.
{
return a+b;
}
호출이 가능한 함수를 만들기 위한 하나의 틀이다. 템플릿은 컴파일러에 의해 처리가 된다.
템플릿을 기반으로 해서 만들어지는 실제 호출이가능한 함수를 가리켜 템플릿 함수라고 한다.
또한 템플릿 함수가 생성되는 현상을 함수 템플릿의 인스턴스화 라고 부른다.
템플릿을 처리해 주는 것은 컴파일러 이기 때문에 템플릿 클래스는 선언과 정의를 각각 다른 파일에 분리 시켜 놓을수 없다. 따라서 클래스 템플릿은 하나의 파일안에 선언과 정의가 함께 있어야 한다.