'템플릿 특화'라는 것은 템플릿 파라메터에 특정 데이터 타입을 지정하므로써 해당 템플릿 클래스로 가능한 구체화 중에서 특정 데이터 타입의 경우만을 특정 코드로 대응 시키는 것을 말합니다.

예를 들자면..

template <class Window, class Contoller>
class Widget {
    ...일반화된 구현...
};

라는 클래스가 있다면 다음과 같이

template <>
class Widget <ModalDialog, MyController> {
    ...ModalDialog, MyController 에만 특화된 구현...
};

특화 될 수 있습니다(예제는 Modern C++ Design에서 베껴 왔습니다. ModalDialog, MyController는 구현되어 있다고 가정 합시다.).

만일 프로그래머가 Widget<ModalDialog, MyController> specialWidget 과 같은 코드 작성했다고 하면, 특정 Widget 클래스의 구현중에서 ModalDialog와 MyController에만 특화된 클래스 코드를 찾아 객체를 생성하게 됩니다. 어떻게 찾는지는 컴파일러가 너무나도 똑똑하게 알아서 잘 해주므로 굳이 신경 쓸 일은 없습니다.

반면, Widget<BaseWindow, BaseController> baseWidget 과 같이 미리 지정되지 않은 타입으로 Widget 클래스의 객체를 만들게 되면 일반화된 Widget 클래스의 객체를 생성하게 됩니다.

이와 같이 특정 데이터 타입에만 특화된 구현을 사용할 수 있도록 하는 것을 템플릿 특화라고 하며, 당연히 위의 specialWidget과 baseWidget 의 객체는 다른 타입의 객체가 됩니다.


그리고 이런 템플릿 특화를 일부분만 특화하고 나머진 일반화 할 수 있는 부분 템플릿 특화(Partial Template Specializtion)라는 것이 있습니다.

일부 템플릿 인자는 구체적으로 명시하고, 나머지 인자들은 일반화된 채로 내버려 둡니다. 그리고 구체적으로 명시된 인자가 지정되는 경우만 특화된 코드를 적용 한다는 것이 부분특화의 특징입니다. 예를 들어 :

template <class Window>
class Widget<Window, MyController> {
    ... 부분 특화된 구현 ...
};

와 같은 부분 특화된 클래스 코드가 있는, 모든 Window 타입에 대해서는 일반화를 적용하지만, 만일 MyController가 지정되는 경우에는 특화된 코드를 적용합니다.

Widget<ModalDialog, MyController> specialWidget  과 같은 코드에서도 특화된 코드를 찾아 객체를 생성하며, Widget<BaseWindow, MyController> baseWidget과 같은 코드에서도 특화된 코드를 찾아 객체를 생성한다는 의미 입니다.

위에서도 언급했지만, 템플릿을 구체화 할 때 컴파일러는 가장 잘 맞는 후보를 정하기 위해 모든 부분의 패턴을 정확하게 파악하게 되며 우리가 염려 하는 것 이상으로 정확한 코드 적용을 해 줍니다.

하지만 템플릿 파라메터의 부분 특화는 클래스에서만 적용 할 수 있고, 멤버함수든 일반 함수든, 함수에 대해서는 적용이 불가능 합니다(일반 전체 템플릿 특화는 함수를 대상으로도 가능합니다).


참고 :
 * Template 부분 특화 시 주의 점 : http://blog.naver.com/hsg556/100011294391

'진리는어디에' 카테고리의 다른 글

ASN.1  (0) 2010.03.22
템플릿 특화를 이용한 튜플 클래스  (0) 2010.02.15
템플릿 특화(Template specialize)  (2) 2010.02.03
C++ #line은 뭐지?  (0) 2010.02.02
WideCharToMultiByte()  (0) 2009.03.20
서브(Sub) 쿼리  (4) 2009.02.26
Posted by kukuta

댓글을 달아 주세요

  1. Favicon of http://blog.ggamsso.wo.tc BlogIcon 깜쏘 2010.02.03 13:37  댓글주소  수정/삭제  댓글쓰기

    요즘 검색엔진 만들면서 STL을 하나씩 구현(?) 하고 있는데... 탬플릿 어려워요