디자인 패턴 #1 [이상한 재귀 템플릿 패턴(CRTP)]

황재진·2022년 8월 19일
0

패턴은 패턴이지만 디자인 패턴이라고 보기에는 어렵습니다.

이 패턴의 아이디어는 자기 자신을 베이스 클래스의 템플릿 인자로 상속받는 것입니다.

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)를 서브 클래스 타입으로 캐스팅해 해당 함수를 호출하게 됩니다.

컴파일 타임에 올바른 자식을 호출할 수 있도록 결졍되기에 성능에서 이점을 가져갈 수 있습니다.

profile
프로그래밍, 쉐이더 등 이것저것 다해보는 게임 개발자입니다

0개의 댓글