패턴은 패턴이지만 디자인 패턴이라고 보기에는 어렵습니다.
이 패턴의 아이디어는 자기 자신을 베이스 클래스의 템플릿 인자로 상속받는 것입니다.
class Base
{
public:
void Execute()
{
Print();
}
virtual void Print()
{
std::cout << "Base Print" << std::endl;
}
}
class Child : public Base
{
public:
void Print() override
{
std::cout << "Child Print" << std::endl;
}
}
int main()
{
Child c;
c.Execute();
return 0;
}
위 코드는 단순 상속을 이용한 출력방식입니다.
vTable이 생성되고 key value를 활용한 방식으로 호출되어 오버헤드가 발생하게 됩니다.
template <typename Derived>
class Base
{
public:
void Execute()
{
(static_cast<Derived*>(this))->Print();
}
void Print() { std::cout << "Base Print" << std::endl; }
};
class Child : public Base<Child>
{
public:
void Print() { std::cout << "Child Print" << std::endl; }
};
int main()
{
Child w;
w.Execute();
return 0;
}
위 코드는 CRTP를 사용한 출력방식입니다.
this(Base)를 서브 클래스 타입으로 캐스팅해 해당 함수를 호출하게 됩니다.
컴파일 타임에 올바른 자식을 호출할 수 있도록 결졍되기에 성능에서 이점을 가져갈 수 있습니다.