반응형
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
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 템플릿 디자인 단위 전략(Policy-Based Design) (0) | 2021.01.09 |
---|---|
C++ 템플릿 디자인 패턴 CRTP 활용 (0) | 2021.01.08 |
C++ 템플릿 패턴 Thin template, 코드 메모리 최적화 기법 (0) | 2021.01.07 |
C++ 가변인자 템플릿(Variadic template) tuple 전체 요소 출력 (0) | 2021.01.07 |
C++ 가변인자 템플릿(Variadic template) tuple을 위한 get 구현 (0) | 2021.01.07 |