C++에서 클래스나 함수를 템플릿으로 선언했을 때, 내가 원하는 타입에 대해서만 따로 특별하게 구현할 수 있는 기능을 제공하는데 이를 템플릿 특수화라고 한다.
예를 들어서 아래와 같이 템플릿으로 함수를 구현했다고 가정하자.
template<typename T>
void Output(T t1, T t2)
{
std::cout << t1 + t2 << std::endl;
}
template<>
void Output(float f1, float f2)
{
std::cout << "Float Sum: ";
std::cout << f1 + f2 << std::endl;
}
int main()
{
Output<int>(3,4); // 1번
Output<float>(3.14f, 5.22f); // 2번
return 0;
}
1번은 첫번째 템플릿 함수인 Output(T t1, T t2) 함수를 호출하지만, 2번은 두번째 템플릿 특수화 함수를 호출한다. float 타입에 대해서만 다른 동작을 하도록 구현되어 있다. 여기서 템플릿 특수화를 하기 위해서 조건이 있다.
1. template<>를 반환형 앞에 써줘야 한다.
2. 반환타입이 같아야 한다.
3. 인자 개수가 같아야 한다.
클래스 템플릿에 대해서는 아래와 같이 부분적으로 특수화를 할 수 있다.
template <typename T, int Size> // int Size = 99; 이렇게 디폴트 인자로 줄 수도 있음
class CTemplate
{
public:
CTemplate()
{
std::cout << typeid(T).name() << std::endl;
std::cout << "Size: " << size << std::endl;
}
~CTemplate()
{
}
private:
T m_T1;
T m_T2;
};
단 주의해야 할 점은 CTemplate 클래스의 객체를 생성하면서 T 타입, int 타입의 Size을 인자로 줄 때 Size인자는 무조건 상수로 줘야한다. 이때 Size인자를 '비타입인자'라고 한다.
int tmp1 = 4;
CTemplate<int, 100> temp1;
CTemplate<float, 400> temp2;
// CTemplate<float, tmp1> temp3; error
'공부 > C || C++' 카테고리의 다른 글
C++ 11 universal reference, std::forward (0) | 2021.07.25 |
---|---|
C++ 11 함수 객체(Functor)와 람다 표현식(Lambda Expression) (0) | 2021.07.24 |
C++ 템플릿 클래스/함수 헤더파일에 선언과 정의 모두 해줘야 하는 이유 (0) | 2021.07.23 |
C++ static variable, static member variable, static member function (0) | 2021.07.23 |
C++ 연산자 오버로딩(Operator overloading) (0) | 2021.07.22 |