(C++)12장 템플릿 개념(함수 템플릿)

**템플릿을 하면 코드의 재사용성이 높아진다.
참고로, 코드의 재사용성은 클래스 상속이나 오버로딩으로도 효과가 나타난다.
<템플릿의 종류>
1. 함수 템플릿
2. 클래스 템플릿.


(1) 함수 템플릿
함수 내에서 사용되는 파라미터의 데이터형을 추상화한 형태이다. 즉, 일반함수를 구현한 뒤 함수 내의 일부 또는 파라미터를 템플릿 파라미터로 치환하 것이다. 

예)
#include<iostream>
using namespace std;

int const add(int const& a,int const& b)
{
 return a+b;
}

int main()
{
 int i=5;
 int j=10;
 cout<<add(i,j)<<endl;
}

만약 double형을 더하려고 한다면 함수를 다시 정의해야 한다. 이 문제를 해결하기 위해
템플릿을 사용해 보겠다

예)
template <typename T>
T const add(T const& a,T const& b)
{
 return a+b;
}
int main(void)
{
 double i=5.1;
 double j=10.2;

 int a=5;
 int b=10;
 cout<<i<<"+"<<j<<add(i,j)<<endl;
 cout<<a<<"+"<<"b"<<add(a,b)<<endl;
}

그러나 만약 add()인자에 int형과 double형을 넣으면 에러가 난다.
그런 경우는 다음과 같이 바꾼다.
template <typename T,typename U>
T const add(T const& a,U const& b)
{
return a+b;
}
하지만 위 결과는 5+10.2=15가 나온다 15.2가 나오도록 하기 위해서는

template<typename R,typename T,typename U>
R const add(T const& a,U const& b)
{
return a+b;
}
int main()
{
int i=5;
double j=10.2;

cout<<i<<"+"<<j<<"="<<add<double>(i,j)<<endl;
return 0;
}
템플릿 파라미터를 double로 명시적으로 선언하였다. 실제로 템플릿 파라미터는 R,T,U세가지 이지만,double하나만 선언을 한 경우는 템플릿 정의의 첫 번째 템플릿 파라미터인 R만 명시적으로 선언한 것이 되고 나머지 T와 U에 대해서는 컴파일 시에 인자 추론을 하여 데이터형이 결정된다.

1.3 함수 템플릿의 특수화

여태까지 int, double형으로 했지만 만약 char, string경우는 어떻게 할까? 바로 그것이 특수화다.
함수 템플릿의 특수화는 함수 템플릿을 먼저 정의한 다음 해당 함수에 대해 특수화를 정의해야 한다.  순서가 뒤바뀌면 컴파일 에러가난다. 함수 템플릿에 대해서 특수화를 정의할 떄는 template<>과 같이 템플릿 파라미터를 선언하지 않는다. 그리고 이어서 원본 함수 템플릿과 달라지는 부분에 대해서 정의한다. 여기서는 템플릿 파라미터 T를 char*로 대체하는 방식으로 정의하였다. 

예)
template<>
char* const add<char*>(char* const& a, char* const& b)
{
 cout<<"specialized"<<endl;
 return strcat(a,b);

}

1.4 함수 템플릿의 오버로딩

예)
template<>
char* const add<char*>(char* const& a,char* const& b)
{
 cout<<"specialized"<<endl;
 return strcat(a,b);
}

char* const add(char* const& a,char* const& b)
{
 cout<<"overloading"<<endl;
 return strcat(a,b);
}

int main(void)
{
 add<char*>(a,b);
 add(a,b);
}

---->>>>>>>>차이는 <char*>밖에 없다.

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기