c++에서 상속을 통해 부모의 프로퍼티를 물려받게된다.
그런데 static 필드의 경우 상속을 하더라도 static하게 남아있는데, derived class마다 static 필드를 새롭게 가지고싶을때가 있다.
이런경우 사용할 수 있는 c++ 패턴이 CRTP(Curiously Recurring Template Pattern)이다.
페러다임이 참 독특하다. 부모가 상속하게될 자식클래스의 타입을 템플릿타입으로 받아 컴파일단계에서 새로운 클래스로 처리되도록 한다.
서로 다른 두 자식클래스 DerivedA, DerivedB에서 부모클래스 Base를 상속할때 템플릿 타입으로 자기 자신을 한다. 컴파일러는 부모의 타입을 Base<DerivedA>와 Base<DerivedB> 두 개의 서로 다른 타입으로 처리하기 때문에 Base클래스의 static 필드 또한 서로 다른 메모리를 가지게 되는것이다!!
메소드에 대해선 조금 다른식으로 처리한다. 부모클래스는 static 메소드의 인터페이스를 정의하고 내부에서 자식클래스의 static 구현메소드를 호출한다. 모양이 썩 예쁘진 않지만 기능은 확실히 하니 필요한 순간이 있으리라.
template<class DerivedType>
class Base{
public:
static int value;
...
static void InterfaceFoo(Parameter parameter){
DerivedType::ImplementedFoo(parameter);
}
};
template <class DerivedType> int Base<DerivedType>::value = INITIAL_VALUE;
class DerivedA : public Base<DerivedA>
{
...
static void implementedFoo(Parameter parameter){
// foo for DerivedA's instances
}
};
class DerivedB : public Base<DerivedB>
{
...
static void implementedFoo(Parameter parameter){
// foo for DerivedB's instances
}
};
이 패턴은 오브젝트 카운터의 구현에 사용될 수 있다.
template<class DerivedType>
class Counter{
private:
static int count;
public:
Counter(){
count++;
}
~Counter(){
count--;
}
};
template <class DerivedType> int Counter<DerivedType>::count=0;
혹은 polymorphic copy construction 페러다임의 구현에도 활용할 수 있다.
'Coding Note' 카테고리의 다른 글
duplicated element name of different enums (0) | 2014.04.29 |
---|---|
anonymus union (0) | 2014.03.07 |
pymongo json (0) | 2014.02.10 |
Flask install & test (0) | 2014.01.23 |
간단한 epoll thread-pooling server (0) | 2014.01.06 |