CRT란?
- 기반 클래스에서 파생 클래스의 이름을 사용할 수 있게 하는 방법
- CRT, CRTP 동일한 말이다. (Curious Recurring Template Pattern)
문법
template<typename T>
class Base
{
public:
Base()
{
cout << typeid(T).name() << endl;
}
};
class Derived : public Base< Derived >
{
};
int main()
{
Derived d;
return 0;
}
- 위에서 자식인 Derived에서 타입을 명시할 때 자신의 타입을 명시하면 부모에서 T는 자식의 것으로 들어가게된다. 그럼 typeid를 하게되면 자식이 불리게된다..
예시1.
template<typename T>
class Window
{
public:
void msgLoop() // void msgLoop(const Window* this)
{
//OnClick(); // this>OnClick();..
static_cast<T*>(this)->OnClick();
}
//이벤트가 많아서 가상함수를 많이 만들면 오버헤드가 크다(가상함수 테이블때문에..)
void OnClick() { cout << "window onClick" << endl; }
};
class FrameWindow : public Window<FrameWindow >
{
public:
void OnClick() { cout << "FrameWindow onClick" << endl; }
};
int main()
{
FrameWindow fw;
fw.msgLoop();
}
- 위의 소스에서 부모의 것을 재사용할려면 일반적으로 virtual을 많이 사용한다. 그렇지만 너무 많은 기능들이 virtual로 된다면 오버헤드가 발생하게된다.. 여기서 해결점은 crt를 이용하는 것이다..
- 부모의 msgLoop에서 타입을 형 변환하는 것이다. 자식의 것으로 형변환을 한 후 OnClick을 호출하면 자식의 것이 호출된다..
CRT를 이용한 싱글톤
- 일단 싱글톤을 만들려면 몇가지 방법이있다.
- 사용자가 개체를 만들 수 없게 하도록 하기위해서 생성자를 private
- 복사, 대입 금지.
- 개체 하나를 만들어서 return 하는 static 맴버함수..
template<typename T>
class Cursor
{
protected:
Cursor() {}
public:
Cursor(const Cursor& c) = delete;
void operator=(const Cursor& c) = delete;
static T& getInstance()
{
static T instance;
return instance;
}
};
class Mouse : public Cursor< Mouse>
{
public:
};
int main()
{
Mouse& m = Mouse::getInstance();
return 0;
}
-
'c++ > template프로그래밍.' 카테고리의 다른 글
std::condition 구현 (0) | 2022.05.23 |
---|---|
type_trais (0) | 2022.05.18 |
template기본문법 (parameter, friend, typename..) (0) | 2022.05.18 |
templateSpecialization, meta template.. (특수화, 메타 템플릿..) (0) | 2022.05.16 |
thintemplate (0) | 2022.05.16 |