단위 전략 클래스 디자인 #1 -
C++ 2008. 1. 24. 10:35 |단위 전략 부분의 디자인 패턴 내용을 보고 있다.
template 을 사용해서 다중 상속과 비슷한 구조를 취하기도 하고 메모리 생성 부분을 struct, class 형태로 따로 빼서 관리도 되는거 같다.
예제 1 :
{
public:
Ca() { value = 100; }
virtual ~Ca() {}
int value;
protected:
private:
};
template< class T>
class Cb
{
public:
Cb() {}
virtual ~Cb() {}
T b;
protected:
private:
};
template< class T>
class Cc
{
public:
Cc() {}
virtual ~Cc() {}
T c;
protected:
private:
};
template
<
class T,
template <class> class CheckingPolicy,
template <class> class ThreadingModel
>
class SmartPtr
{
public:
SmartPtr() {}
~SmartPtr() {}
public:
T a;
CheckingPolicy<T> b;
ThreadingModel<T> c;
};
typedef SmartPtr<Ca, Cb, Cc> WidgetPtr;
위의 내용에서 보면 typedef를 사용해서 WidgetPtr을 하나 만들고 있다.
여기에 들어가는 내용은 Ca, Cb, Cc 가 있으며,
Cb, CC는 Ca를 포함할 수 있기 때문에 template로 선언되어 있는게 조건인듯 하다.
위와 같이 선언한 후에 아래와 같이 선언해서 사용하게 된다.
TestPtr< OpNewCreator > b;
이렇게 되면 b의 내용을 보면 SmartPtr의 클래스 내부에 b, c가 존재 하는데
이것은 T라는 템플릿 즉, Ca를 가지게 되며, 다른 동작들을 관리할 수 있을거 같다.
예제 2 :
{
public:
CTest() { value = 20; }
~CTest() {}
public:
int value;
};
template <class T>
struct OpNewCreator
{
static T* Create()
{
return new T;
}
};
template < template <class T> class CreationPolicy>
class TestPtr : public CreationPolicy<CTest>
{
public:
TestPtr()
{
ptr = CreationPolicy<CTest>().Create();
}
~TestPtr()
{
}
public:
CTest* ptr;
};
이 곳에서 몇개의 다른 처리를 해서 넘겨 주는 형태를 취해도 될것 같다.
상속 형태로 해서 아래와 같은 코드로 작성 하면,
template < template <class T> class CreationPolicy>
class TestPtr : public CreationPolicy<CTest>
...
이렇게 하고 나서
ptr = CreationPolicy<CTest>().Create();
이런 식으로 생성할 수 있다. 이 코드 참 멋진듯 하다. ^^
생성해서 처리 하는 방법은 아래와 같습니다.
TestPtr< OpNewCreator > b;
b.ptr->value = 30;
printf("%d\n", b.ptr->value);
TestPtr< OpNewCreator > c;
b.ptr->value = 50;
printf("%d\n", b.ptr->value);
아뭍턴.. 템플릿을 구현하는 방법이 복잡하긴 하지만,
제대로 사용하면 정말로 많은 기능을 구사할 수 있다.