본문 바로가기
c++/template프로그래밍.

template_CRT

by kcj3054 2022. 5. 22.

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