STL - 템플릿
‘뇌를 자극하는 C++ STL - 공동환’ 책 및 c++ reference를 참고하여 작성한 포스트입니다.
템플릿은 함수 템플릿(function template)과 클래스 템플릿(class template)으로 나뉜다.
함수 템플릿은 함수를 만들어 내고, 클래스 템플릿은 클래스를 만들어내는 틀이다.
함수 템플릿
- 템플릿 함수를 사용하면 컴파일러는 함수 호출 인자 타입을 보고 템플릿 함수의 매개변수 타입을 결정하여 실제 함수인 템플릿 인스턴스 함수를 생성한다.
- 즉, 컴파일이 완료되면 함수 템플릿은 존재하지 않고, 인스턴스화 된 함수들이 생긴 상태가 된다.
- 매개변수 타입 객체는 템플릿 함수 정의의 연산이 가능한 객체라면 모두 올 수 있다.
template<typename T>
void Swap(T &a, T &b)
{
T temp = a; // 복사 생성자
a = b; // 대입 생성자
b = temp; // 를 매개변수 객체들이 지원해야 한다.
}
- 함수 템플릿의 매개변수로 타입뿐 아니라 정수 등도 가능하다.
- 이 경우 다음과 같이 명시적으로 호출해 주어야 한다.
- 인스턴스는 PrintArray<int, 5>() 와 PrintArray<float, 5> 가 생성된다.
template<typename T, int size>
void PrintArray(T* arr)
{
for(int i=0; i<size; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int intArray[5] = {1, 2, 3, 4, 5};
float floatArray[5] = {0.1, 0.2, 0.3, 0.4, 0.5};
PrintArray<int, 5>(intArray);
PrintArray<float, 5>(floatArray);
return 0;
}
함수 템플릿 특수화
- 함수 템플릿 특수화(Function Template Specialization)은 특수화된 버전의 함수 템플릿을 더 제공한다고 보면 된다.
- 다음 Point 클래스는 « 연산자가 오버로딩 되어 있지 않아 cout으로 출력할 수 없다.
- « 연산자를 오버로딩 하지 않고 특수화 함수 템플릿을 이용하면 출력이 가능하다.
- 일반화 버전의 템플릿 함수도 있어야 한다!
class Point
{
int x; int y;
public:
Point(int _x, int _y) : x(_x), y(_y) {}
void print() const {
cout << x << ", " << y << endl;
}
};
template<typename T>
void Print(T a)
{
cout << a << endl;
}
template< >
void Print(Point a)
{
cout << "특수화 템플릿 함수 : ";
a.print();
}
int main()
{
Point pt(1, 2);
Print(pt);
return 0;
}
클래스 템플릿
- 함수 템플릿과 비슷하게 클래스를 만들어내는 틀(메타 코드)이다.
- 함수 템플릿처럼 디폴트 매개변수 값 지정도 가능하고, 특수화 버전도 가능하다.
template<typename T=int, int capT=10> // int, 10 디폴트 매개변수 값 지정
class Array
{
// ...
};
template<> // 특수화 버전
class Array<Point>
{
// ...
};
int main()
{
Array<> intarr; // 디폴트 매개변 수 값 사용
Array<double> darr;
Array<string, 5> sarr;
Array<Point> parr; // 특수화 버전
return 0;
}
Leave a comment