template는 매개변수의 타입에 따라 함수나 클래스를 생성하는 C++의 일반화 프로그래밍의 메커니즘입니다.
template를 사용하면 같은 작업, 다른 매개변수에 따라 동작하는 함수나 클래스를 한번에 정의할 수 있습니다.
함수 템플릿은 다음과 같은 방식으로 사용합니다.
// 일반적임 함수 템플릿
template <typename T>
// 함수
{
// 본체
}
typename키워드 대신 class 키워드를 사용하셔도 됩니다.(C++ 98 부터 typename 키워드 추가됨)
아래 예제는 두개의 매개 변수의 합을 표시하는 Sum 함수를 template로 작성한 것입니다.
template <typename T>
T Sum( T A, T B )
{
T C = A + B;
cout << "Sum : " << C << endl;
return C;
}
int main()
{
// 일반적임 함수 템플릿
float fA = 4.3f, fB = 6.2f;
Sum<float>( fA, fB );
short sA = 4, sB = 1;
Sum<short>( sA, sB );
cout << endl;
return 0;
}
위 함수를 실행하면 아래와 같이 출력됩니다.
Sum : 10.5
Sum : 5
템플릿의 경우 특정 매개변수 타입으로 재정의를 하고 싶을 때, 아래와 같이 코딩하면 됩니다.
Sum함수에서 char*에 대한 매개변수 타입에 대해 특별한 동작을 정의한 예제입니다.
template <>
char* Sum<char*> ( char* s1, char* s2 )
{
char* str = "[char*] template";
cout << s1 << " " << s2 << endl;
return str;
}
위와 같은 템플릿 정의를 템플릿 명시적 특수화(template explicit specialization) 이라 합니다.
전체 코드는 아래와 같습니다.
#include <iostream>
using namespace std;
// 일반적임 함수 템플릿
// class, typename 둘다 사용 가능
//template <typename T>
template <typename T>
T Sum( T A, T B )
{
T C = A + B;
cout << "Sum : " << C << endl;
return C;
}
// template 특수화 : 재정의 하고싶을때
template <>
char* Sum<char*> ( char* s1, char* s2 )
{
char* str = "[char*] template";
cout << s1 << " " << s2 << endl;
return str;
}
int main()
{
// 일반적임 함수 템플릿
float fA = 4.3f, fB = 6.2f;
Sum<float>( fA, fB );
short sA = 4, sB = 1;
Sum<short>( sA, sB );
cout << endl;
// template 특수화 : 재정의 하고싶을때
char *s1 = "hellow C++";
char *s2 = "world";
Sum<char *>( s1, s2 );
cout << endl;
return 0;
}
출력 결과
Sum : 10.5
Sum : 5
hellow C++ world