본문 바로가기

Coding Note

c++ CRTP(curiously recurring template pattern)

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