template <class T>
void Swap(T& a, T& b);
int main()
{
int x = 0;
int y = 2;
Swap(x, y);
cout << x;
return 0;
}
template <class T>
void Swap(T& a, T& b)
{
T temp;
temp = a;
a = b;
b = temp;
}
- 템플릿의 선언은 함수원형과 함수정의 모두 써주어야 한다.
- 위의 상황에서는 int형 두 개의 교환을 썻기때문에 T에 모두 int가 들어간다.
- 만약 int, long을 바꾸려했다면 오류다. 왜냐하면 두개의 자료형이 모두 T이기 때문에 자료형이 같아야한다.
- double과 double일 경우 T가 모두 double로 들어가게 된다.
- 위와 같이 여러 자료형이 필요하고 같은 코드를 써야한다면 실용적이다.
- 함수 오버로딩을 줄일 수 있다. (함수내 내용이 같을 경우)
template <typename T>
void Swap(T *a, T *b, int n);
template <typename T>
void Swap(T& a, T& b);
- 이런식의 활용도 가능하다. 함수내의 모든 매개변수가 템플릿형일 필요는 없다.
template <class T>
void Swap(T& a, T& b)
{
T temp;
temp = a;
a = b;
b = temp;
a = a + b; //구조체가 들어왔을 때의 오류
}
- T에 구조체가 들어갔을 경우 오류가 난다. 구조체의 덧셈은 안 되기 때문
3세대 특수화
template <class T> //템플릿
void Swap(T& a, T& b)
{
T temp;
temp = a;
a = b;
b = temp;
a = a + b;
}
template <> //명시적 특수화
void Swap(test& a, test& b)
{
test temp;
temp = a;
a = b;
b = temp;
}
//템플릿이 아닌 함수
void Swap(test& a, test& b)
{
test temp;
temp = a;
a = b;
b = temp;
}
- 위와 같이 있을 때 함수의 매개변수에 test의 데이터형을 넣을 경우 먼저 템플릿이 아닌 함수를 사용한다.
- 그 다음 템플릿이 아닌 함수가 없을 경우 명시적 특수화를 한 함수를 선택하게 된다.
명시적 특수화와 명시적 구체화
test x, y;
//기본 템플릿
template <class T> void Swap(T &a, T &b);
//명시적 특수화
template <> void Swap(test& a, test& b);
Swap(x, y);
//명시적 구체화
template void Swap<test>(test& a, test& b);
Swap<test>(x, y); //함수 사용 시 명시적으로 이것을 사용할 것이라고 표시
//암시적 구체화
Swap(x, y); //void Swap(int &, int&)를 생성한다 //암시적으로 표시
- 하나의 프로그래밍 단위에서 동일한 데이터형에 대해 명시적 구체화와 명시적 특수화를 함께 사용하면 안 된다. 예시라서 쓴 것
- 명시적 구체화는 템플릿의 매개변수의 형태를 따른다. T &a일경우 test& a의 형식으로 써야한다
- 명시적 구체화는 함수원형만 있으면 되고 명시적 특수화는 함수를 새로 작성한다.
- 명시적 구체화는 템플릿 정의를 사용하여 해당 버전의 함수를 생성하게 된다.
- 명시적 특수화는 따로 함수를 만들어야 한다. (템플릿에서 있는 특정조건에 대해서 따로 함수를 설계한다)
매개변수를 더하는 함수였다면 구조체는 더할 수 없으므로 따로 작성하여 구조체에 대해서 더해야 될 것들을 따로 더해주는 느낌으로 작성한다.
'C++ > Basic' 카테고리의 다른 글
[C++] extern의 사용법 (0) | 2021.06.16 |
---|---|
[C++] decltype에 대하여 (0) | 2021.06.14 |
[C++] 함수의 디폴트 매개변수 (0) | 2021.06.09 |
[C++] inline함수와 define의 차이 (0) | 2021.06.08 |
[C++] 배열을 매개변수로 사용할 때 (0) | 2021.06.07 |