3 분 소요

CRTP: Curiously Recurring Template Pattern

  • 부모가 템플릿 인데, 자식을 만들때 자신의 이름을 부모에게 인자로 전달해 주는 기술
  • 미래에 만들어질 자식의 이름을 사용 할 수 있다. ```cpp #include

// CRTP 를 사용한 비 가상함수를 가상함수 처럼 동작하게 할 수 있다. // Microsoft 의 라이브러리 중 ATL, WTL 이라는 라이브러리가 이 기술을 사용한다. template class Window { public: void msgLoop() { static_cast<T*>(this)->onClick(); // T 의 onClick() 실행 } void onClick() { std::cout << "Window onClick" << std::endl; } };

class MyWindow : public Window { // Window 에 T 로 MyWindow 를 넘겨준다. public: void onClick() { // 결국 Window::msgLoop() 에서 MyWindow::onClick() 실행 std::cout << "MyWindow onClick" << std::endl; } };

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 class Count { public: static int cnt; inline static void print_count() { std::cout << cnt << std::endl; } inline Count() { ++cnt; } inline ~Count() { --cnt; } }; template int Count::cnt = 0;

// car, truck 각각의 객체 개수를 관리하고 싶다. class Car : public Count {}; class Truck : public Count {};

int main() { Car c1, c2; Truck t1, t2, t3;

c1.print_count();   // 2
t3.print_count();   // 3 } ```

카테고리:

업데이트:

댓글남기기