• 템플릿 템플릿 인자

    2013. 9. 27.

    by. xxx123

     

    템플릿의 매개변수로 또 다른 템플릿을 사용하는 것이 템플릿 템플릿 인자이다.

     

     


     

    다음은 어떤 타입으로든 메모리를 할당할 수 있도록 템플릿으로 구현한 메모리 할당 클래스이다.

    메모리를 할당할 때 여러가지 방법으로 할당할 수 있는데, 이렇게 할당이라는 하나의 전략에 대해 여러가지 방법으로 구현이 가능할 때, 그 구현 클래스를 가리켜 단위전략 클래스라고 한다.

    이러한 클래스는 단독으로 사용되기 보다는, 다른 클래스의 기반 클래스로 사용되는게 보통이다.

     

     

     

    다음은 위에서 만든 Allocator 클래스를 상속 받아 오브젝트의 메모리 할당을 위 두 클래스 중 선택적으로 골라 할 목적으로 만든 Object 관리 클래스 이다.

    이렇게 단위전략 클래스를 사용하는 클래스를 호스트 클래스라 한다.

     

     

     

    이 녀석은 단순한 Object 클래스, ObjectManager에 의해 할당되고 관리될 클래스이다.

     

     

    ObjectManager의 객체를 생성하고, 메모리를 할당하는 과정이다.

     

    ObjectManager가 사용할 단위전략객체를 선택하여 템플릿 인자로 넣어주고, 또 그 단위전략객체가 사용할 타입을 결정하여 단위전략객체의 템플릿 인자로 넣어준다.

     

     

     

    이렇게 구현하게 되면 생기는 문제점.

    1. 단위전략객체인 NewAllocator가 어떤 타입의 객체를 생성할 것인지 구현부에서 적어 줘야 한다. 일단은 코드가 길어지며 썩보기 좋지는 않다.

    2. 타입을 구현부에서 넣어줌으로써 사용자가 잘못된 타입을 할당 할 수 있다. ObjectManager라는 클래스는 클래스 이름에서 알 수 있듯이 Object 객체를 관리하는 클래스인데 잘못된 타입을 넣을 경우 잘못된 동작을 할 수 우려가 생긴다.

     

     

     

     

     

     

    그래서 사용하는 것이 템플릿 템플릿 인자.

    위 코드만 봐서는 문법이 굉장히 어려워 보인다. 

    하지만 알고보면 간단하다.

     

    표시된 부분은 단순히 Allocator라는 클래스가 템플릿 타입의 클래스라는 것을 나타내주는 표시일 뿐이다.

    실제로 class T의 T심볼은 어디에서도 사용되지 않는다. 단순히 형식적인 표시자이기 때문이다.

    이렇게 템플릿의 인자로 템플릿 클래스를 넣어 사용할 수 있으며,

    코드에서 처럼 Allocator를 상속 받는 과정에서 타입을 명시해 주어 어떤 용도로 사용할 것인지 명확히 밝힌다.

     

    읽어 보자면 이렇다. ObjectManager는 템플릿 타입 클래스인 Allocator를 상속 받을 건데, 그 타입은 Object이다.

     

     

     

    사용은 다음과 같이 간단하다. 타입에 대한 정보는 상속과정에서 넘겨 주었기때문에 사용자는 어떤 타입을 할당할 것인지에 대해서는 알 필요가 없다. 고로 실수 할 일이 없어지며, 코드 또한 간략해진다.

     

     

     

     

     

    또 다른 예제를 살펴보자.

    템플릿 형 U 명시하고 그 타입에 따라 Allocator가 할당하는 타입을 결정하는 방식이다.

    STL에서 사용하는 형식이 바로 그것이다.

     

     

    이런식으로 타입을 정하고, Allocator의 종류도 정할 수 있다.

    Allocator는 물론 int타입을 할당하는 할당자가 될 것이다.

     

    클래스 코드에서 기본 할당자로 NewAllocator를 지정해 놓아서 할당자를 명시해 놓지 않으면 NewAllocator를 통해 할당한다.

     

     

     

     

     

     

     

     

     

     

     

     

    'Programming > C/C++' 카테고리의 다른 글

    Virtual Table (가상함수 테이블)  (0) 2014.12.18
    inline  (0) 2014.12.17
    CreateThread & _beginthreadex  (0) 2014.11.02
    new operator, operator new, placement new  (0) 2014.07.18
    shared_ptr  (0) 2014.06.20

    댓글