5년 전에 원노트에 정리했던 내용을 벨로그로 옮기는 작업을 하고 있다.

🏷️Specialization(특수화)
- 말 그대로 함수 템플릿나 클래스 템플릿 중 타입을 지정하는 특수한 케이스를 정의하는 것을 뜻한다.
- 특수화엔 두가지 종류가 있다.
📌명시적 특수화(전체 템플릿 특수화)
- 모든 템플릿 매개변수의 타입을 지정해서 정의하는 것이다.
- 클래스 템플릿과 함수 템플릿 모두 가능하다.
1. Class Explicit Specialization(Total Template Specialization)
template <>
class Foo<int, int>
{
T1 a;
T2 b;
...
}
2. Function Explicit Specialization
template <>
T1 bar<int, int>(int a, int b)
{
...
}
📌부분 특수화
- 일부 템플릿 매개변수의 타입을 지정해서 정의하는 것이다.
- 클래스 템플릿만 가능하고, 함수 템플릿은 안된다.
1. Class Template Partial Specialization
template <typename T2>
class Foo<int, T2>
{
T1 a;
T2 b;
...
}
- 함수 템플릿는 부분 특수화는 불가능하지만, 오버로딩을 사용하면 된다.
- 그러나 명시적 특수화된 함수들보다 위에 정의되어 있어야 한다.
- 한 함수 템플릿에게 명시적 특수화와 오버로딩을 같이 사용하는 프로그래밍은 지양하는 것이 좋다.
- 명확하지 않은 함수 템플릿이 구체화될 수 있기 때문이다.
2. Function template Overloading
template <typename T1, typenameT2>
T1 bar(T1 a, int b)
{
...
}
- 사용하지 않는 템플릿 매개변수는 빼주어야 제대로 동작한다.
- 일반 함수로 오버로딩 할 수도 있다.
3. Normal Function Overloading
int bar(int a, int b)
{
...
}
📌호출 우선 순위
- 일반 함수 > 명시적 특수화 함수 템플릿 > 함수 템플릿 오버로딩 > 함수 템플릿
🏷️Instantiation(구체화)
- 구체화는 컴파일러가 특정 데이터 타입에 맞는 함수의 정의를 생성하기 위해 템플릿을 사용하는 것을 뜻한다.
- 구체화엔 두가지 종류가 있다.
📌암시적 구체화
- 함수 템플릿을 호출하는 경우, 컴파일러가 함수의 인자의 데이터 타입을 분석 알아서 구체화 하는 것이다.
- 클래스 템플릿을 생성하는 경우, 컴파일러가 클래스 생성자를 통해서 타입 추론하는 방법이다. (C++17이상)
- 클래스 템플릿의 경우 사용하지 않는 멤버 함수는 인스턴스화 되지 않는다. (lazy instantiation)
📌명시적 구체화
- 템플릿을 사용해서 특정 타입의 함수나 클래스를 생성해 달라고 명시적으로 지시하는 것이다.
- 클래스 템플릿의 명시적 구체화는 다음과 같이 사용한다.
template class Foo<int>;
- 함수 템플릿의 명시적 구체화는 다음과 같이 사용한다.
template int bar<int>(int);
- 명시적으로 타입을 지정하여 함수를 호출 할 수 있다.
bar<int>(인자);