프로그래밍 언어/C++
C++ 템플릿 디자인 패턴 CRTP(Curiously Recurring Template Pattern) 패턴
더해리
2021. 1. 7. 23:17
반응형
CRTP(Cruiously Recurring Template Pattern) 활용
-
기반 클래스에서 파생 클래스의 이름을 사용할 수 있게 하는 기법
-
파생 클래스를 만들때 기반 클래스의 템플릿 인자로 파생 클래스 이름을 전달
기준 코드
- 메인 함수 호출 시 기반 클래스의 OnClick 함수가 호출됨
- 파생 클래스의 OnClick 함수를 호출하기 위해서는?
#include <iostream>
using namespace std;
class Window
{
public:
void msgLoop()
{
OnClick();
}
void OnClick() { cout << "Window OnClick" << endl; }
};
class FrameWindow : public Window
{
public:
void OnClick() { cout << "FrameWindow OnClick" << endl; }
};
int main()
{
FrameWindow fw;
fw.msgLoop(); // OUTPUT : Window OnClick
}
구현 코드
- 비 가상 함수(Non virtual function)를 가상 함수 처럼 동작하게 함
- 파생 클래스를 만들때 기반 클래스의 템플릿 인자로 파생 클래스 이름을 전달
- this 포인터를 파생 클래스 타입으로 캐스팅 후 함 수 호출
#include <iostream>
using namespace std;
template<typename T>
class Window
{
public:
void msgLoop()
{
// this 포인터를 파생 클래스인 T 타입으로 캐스팅 후 호출
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(); // OUTPUT : FrameWindow OnClick
}
반응형