- 템플릿(template): 물건을 만들 때 사용되는 틀이나 모형을 의미
- 함수 템플릿(function template): 함수를 찍어내기 위한 형틀
int get_max(int x, int y)
{
if( x > y ) return x;
else return y;
}
타입만 바뀌면 다른 타입도 만들 수 있다.
- 일반화 프로그래밍(generic programming): 일반적인 코드를 작성하고 이 코드를 정수나 문자열과 같은 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법
->>>>>
함수 템플릿
template<typename T> // 모두 T니깐 모두 같은 타입이어야 한다.
T get_max(T x, T y)
{
if( x > y ) return x;
else return y;
}
사용시는
get_max(1,3) 이렇게 하면 - ->> 자동적으로 int get_max( int x, int y ) 이런식으로 만들어 진다
->>> 컴파일러가 자동적으로 만든다.
함수 템플릿의 특수화
template <typename T> // 함수 템플릿으로 정의
void print_array(T[] a, int n) // 타입에 종속적이지 않다.
{
for(int i=0;i<n; i++)
cout << a[i] << " ";
cout << endl;
}
template <> // 템플릿 특수화
void print_array(char[] a, int n) // 매개 변수가 char인 경우에는 이 함수가 호출된다.
{
cout << a << endl;
}
이건 특수화가 아니라 중복정의이다.
특수화랑 중복정의랑 차별점은 ??
-> 특수화는 이름 같고, 템플릿 함수의 한부분을 빼둔것이다. 범용적으로 사용이 가능한데, 재정의 처럼 한것이다.
-> 중복정의는 ( 레퍼런스로 받을때는 변수의 이럼을 받는다 )
서로 다른 형을 받는다 레퍼런스 < -- > 포인터
두 개의 타입 매개 변수를 가지는 함수 템플릿
-> 큰 타입이 작은 타입으로 대입되면 안된다. 일반화 시킬때 조심해야 한다.
특수화를 이용한 소스코드
template <typename T>
void printArr( T a[], int n ){
for(int i=0; i< n; i++)
cout<<a[i] << " ";
cout<<endl;
}
template <> // 특수화
void printArr( char a[], int n ){ // 문자배열이오면이걸로실행된다
cout<<a <<endl; // 컴파일러가알아서함수만들어서실행
}
void main(){
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
char b[] = "char is arr";
printArr( a, 10 );
printArr( b, sizeof(b) );
}