템플릿 템플릿 파라미터

반응형


템플리의 파라미터로 템플릿을 사용하는 것을 말한다.
이를 사용하는 이유는 요소의 데이터형에 대해 다시 명시해 주지
않아도 컨테이너형을 명시할 수 있는 템플릿을 선언할 수 있다는 점이다.
ex)
   Stack<int, std::vector<int> > vStack;
   Stack<int, std::vector> > vStack;

첫번째 줄의 샘플을 보면 내부 컨테이너형을 명시하기 위해 컨테이너형과 함께 요소의 데이터형도 다시 넘겨준다.
하지만 템플릿 템플릿 파라미터를 사용하면 두번째줄의 예와 같이 요소의 데이터형에 대해 다시 명시해주지 않아도 된다.

template <typename T,
template <typename ELEM, typename ALLOC> class CONT = std::deque > // 템플릿 템플릿 파라미터, class 키워드사용해야함.
class Stack {
private:
 CONT<T, std::allocator<T> > elems;         // elements

public:
 void push(T const&);   // push element
 void pop();            // pop element
 T top() const;         // return top element
 bool empty() const {   // return whether the stack is empty
  return elems.empty();
 }
};

템플릿 템플릿 인자의 파라미터가 자신이 치환할 템플릿 템플릿 파라미터의 파라미터들과 정확히 일치해야만 한다.


기본값으로 초기화 되는 템플릿형의 변수를 원할때
template <typename T>
void foo()
{
  T x = T();
}

와 같이 사용하면 된다.

데이터형이 파라미터화된 클래스 템플릿의 멤버가 제대로 초기화 되게 하기 위해,
멤버를 초기화 하는 초기화 함수 목록을 가지는 기본 생성자를 정의할 수도 있다.
template <typename T>
void MyClass
{
   private:
    T x;
   public:
     MyClass() : x(){}
};
TAGS.

Comments