기존의 템플릿 인자를 우리는 <T> 이렇게 하나만 사용했다.
하지만 두 개라면 어떨까?
배열의 예시를 보자면, 현재 T_SIZE를 컴파일 이전에 기입했기에, 이를 코드로 구현했다.
전의 13-(1) 템플릿 포스트를 보면, 헤더 파일의 print() 내용들을 다른 cpp에 옮겨넣었다.
그 때 명시를 해줘야한다했다.
하지만 지금의 사례는? 명시하기가 힘들다. <T, unsigned int a>라 할 때, a에 들어갈 수가 무한정이기 때문에
일일이 해주기가 힘들다. 그래서 이럴 땐 그냥 맘 편하게 cpp로 따로 분리하기 보다는 그냥 헤더파일에 넣는다.
template은 모든 경우에 적용되게 설정했다. 그런데, 예를 들어 T가 char인 경우는 따로 작동하게 하고 싶어요! 라면
어떻게 해야할까? 특별한 경우를 조건으로 걸어줘야겠지.
이 경우를 specialization이라 보통 말하고, 구현 방법은 심플하다.
template<>으로 해주면 된다.
그러고 나서 원하던 형의 함수를 구현해주면 된다.
그러면 위의 template<t>아래의 함수와 template<>의 함수는 별개의 것으로 구분된다.
함수가 아닌 클래스에 specialization을 하는 것도 마찬가지다.
원하는 해당 클래스나 클래스 멤버함수에 똑같이 template<>을 해주면 된다.
저번에 언급했다시피, template을 썼다면, 실제 내가 template에 어떤 자료형을 쓸 것인지를 명시해줘야한다.
그렇기에 단순히 A a_int이런게 아닌, A<int> a_int 이렇게 명시해줘야한다.
여기선 char의 경우 specialization을 해주고 싶어서
template<>
class A<char>을 해준 것이다.
template<typename T> class A 와 template<> class A<char>은 별개의 것으로 작동하는 것이기 때문에,
해당 a_char에서 test라는 함수가 없다고 나온다.
bool의 경우를 따로 specialization해줬다. 비트 마스크를 활용하고 있다.
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 13-(4). 템플릿 (포인터, 멤버 함수 한번 더 템플릿) (0) | 2021.11.12 |
---|---|
Chapter 13 -(3). 템플릿을 부분적으로 특수화 (0) | 2021.11.11 |
Chapter 13 - (1). 템플릿 Template (0) | 2021.11.07 |
Chapter 12(가상 함수들) 끝. (0) | 2021.11.06 |
Chapter 12-7, 8. 순수 가상 함수, 추상 기본 클래스, 인터페이스 클래스, 다이아상속문제 (0) | 2021.11.03 |