클래스 템플릿이란 무엇인가?
 함수 템플릿 처럼, 클래스도 여러개의 데이터형으로 바뀔 수 있는 것을 말한다. 이러한 클래스 템플릿은 컨테이너류에 가장 많이 쓰이며, 대표적인 것으로는 std::vector 가 있겠다.

클래스 템플릿을 어떻게 선언하는가?

위에 처럼 선언할 수 있으며, typename 대신 class 를 사용 할 수 있다. 여기서 T는 멤버 함수나 멤버 변수를 선언 할 때 사용 된다.  즉, 다음과 같이 사용 될 수 있다.

여기서 클래스 형은 Stack<> 이다. 즉, Stack 이 절대 아니다. T는 템플릿 파라미터 이므로, 정확한 클래스 명은 Stack<T> 가 된다. 뒤에서 나오겟지만 기본 템플릿 파라미터가 있을 경우 Stack<> 로 해야 할 것이다.

자기 자신의 데이터형을 알아 두는 것은 중요하다. 왜냐하면, 자기 자신을 받아 처리하는 멤버 함수, 즉, 복사 생성자와 복사 할당자를 정의 하려 할 때 필요하기 때문이다. 중요한 이유는 이렇지만, 클래스 템플릿 내부에선 Stack 이라고만 써도 된다. (비멤버 함수로 넘길때는 중요하다,)


멤버 함수는 어떻게 구현하는가?
 클래스 템플릿 내부에서 구하는 것이라면, 일반 클래스 처럼 구현하면 된다. 하지만 클래스 템플릿 외부에 그 구현을 둘 때에는 항상 함수 템플릿이라는 것을 명시해야 한다.

사례 1. Stack 내부에서 Push 구현

사례 2. Stack 외부에서 Push 구현

클래스 템플릿을 어떻게 사용 할 수 있는가?

위의 소스 코드 처럼 사용 할 수 있다. 여기서 또 하나 중요한 사실은 Stack<int> 에선 pop 멤버 함수 자체가 없고, Stack<std::string> 에선 pop 멤버 함수가 있다는 것이다. 템플릿은 호출되는 코드에 대해서만 인스턴스화 되기 때문이다. 따라서 클래스 템플릿의 모든 멤버를 다 사용하지 않는다면, 그만큼 실행 파일의 크기가 줄어 들 것이다.

클래스 템플릿은 어떻게 특수화 할 수 있는가?
템플릿 특수화는 함수 템플릿 특수화와 똑같이 할 수 있다. 다음 코드를 보자

클래스 템플릿 특수화의 멤버 함수의 구현은 내부에 정의하면 일반 클래스와 똑같지만, 외부에 정의할 때는 template 를 빼고 다음과 같이 정의 하면 된다.

클래스 템플릿의 부분 특수화는 어떻게 하는가?
부분 특수화는 여러개의 템플릿 파라매터 중 부분적으로만 특수화를 하는 것을 뜻한다. 예를 들어 다음과 같은 클래스 템플릿이 있다고 치자.

여기에 부분 특수화를 하면 다음 처럼 할 수 있다.

클래스 템플릿의 부분 특수화는 어떻게 사용 할 수 있는가?
... 생략

기본 템플릿 인자는 무엇이며, 어떻게 사용 할 수 있는가?
기본 템플릿 인자는 템플릿 파라미터가 기본적으로 갖는 인자를 말한다. C++ 이서 default parameter와 같은 개념이다. 여기서 다른 점은 함수 템플릿에는 안된다. 클래스 템플릿만 된다. 재미있는 것으로는 기본 템플릿 인자는 이전의 템플릿 파라미터를 참조 할 수 있다는 것이다.

기본 템플릿 인자를 갖은 클래스 템플릿은 어떻게 사용 하는가?

총평
이렇게 하나씩 쌓아가다 보면 template metaprogramming 을 할 수 있겠지?

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기