CRTP
CRTP: Curiously Recurring Template Pattern
- 부모가 템플릿 인데, 자식을 만들때 자신의 이름을 부모에게 인자로 전달해 주는 기술
- 미래에 만들어질 자식의 이름을 사용 할 수 있다.
```cpp
#include
// CRTP 를 사용한 비 가상함수를 가상함수 처럼 동작하게 할 수 있다.
// Microsoft 의 라이브러리 중 ATL, WTL 이라는 라이브러리가 이 기술을 사용한다.
template
class MyWindow : public Window
int main() { MyWindow w; w.msgLoop(); }
---
싱글톤: 오직 하나의 객체만 생성되게 하는 디자인 패턴
```cpp
#include <iostream>
class Cursor {
private:
Cursor() {}
static Cursor* instance;
public:
// 오직 하나의 객체만 만들어서 리턴하는 정적 함수
static Cursor& getInstance() {
if (instance == nullptr) {
instance = new Cursor;
}
return *instance;
}
};
Cursor* Cursor::instance = nullptr;
int main() {
Cursor& c1 = Cursor::getInstance();
Cursor& c2 = Cursor::getInstance();
std:: cout << &c1 << ", " << &c2 << std::endl; // 000001906112E580, 000001906112E580
}
#include <iostream>
template<typename T>
class Singleton {
private:
Singleton() {}
static T* instance;
public:
static T& getInstance() {
if (instance == nullptr) {
instance = new T;
}
return *instance;
}
};
template<typename T>
T* Singleton<T>::instance = nullptr;
// 내가 원하는 클래스를 싱글톤으로 만들고 싶다.
class Mouse : public Singleton<Mouse> {};
int main() {
Mouse& m = Mouse::getInstance();
std::cout << &m << std::endl;
}
Singleton.h
CRTP 를 사용해서 모든 자식 클래스의 부모가 다른 타입이 되게 하는 기술
- 부모의 static 변수를 자식들이 각각 따로 사용하게 할 수 있다. ```cpp #include
template
// car, truck 각각의 객체 개수를 관리하고 싶다.
class Car : public Count
int main() { Car c1, c2; Truck t1, t2, t3;
c1.print_count(); // 2
t3.print_count(); // 3 } ```
댓글남기기