모던 C++ 디자인 패턴 : CRTP 란?

brewmaster
newworld-kim
Published in
Nov 19, 2020

CRTP 이라는 광용구가 중요한 C++ 개념으로 책에 소개되었다. 한글로 풀어쓰면 이상한 재귀 템플릿 패턴 (Curiously Recurring Template Pattern) 이라고 한다. (패턴으로서 자격이 있다고 하기는 어렵다고 하지만) 이 패턴의 아이디어는 자기 자신을 베이스 클래스의 템플릿 인자로 상속 받는 것이라고 한다.

Foo 를 입력인자로 받는 SomeBase를 상속 받은 Foo 클래스

이해가 잘 안간다. 예제를 보자.

CRTP 패턴을 통해, Foo 클래스는 템플릿 인자로 Foo를 입력 받는 SomeBase 클래스 상속 받았다. 덕분에 SomeBase 클래스 구현부에서 타입이 지정된 Foo 클래스와 같은 지정된 this 포인터를 사용할 수 있게 된다고 한다.

그럼, SomeBase 클래스에서 상속 받는 클래스들의 this 포인터를 사용하면 뭐가 좋을까? 책에서 소개하는 아래 예제를 보자.

Derived를 입력 받는 SomeBase 클래스의 static_cast의 활용

CRTP 패턴을 통해 우리는 SomeBase 클래스(또는 구조체)에서 Derived 클래스의 this 포인터를 static_cast로 캐스팅하여 사용할 수 있게 된다.

다른 블로그에서 소개하는 다른 예제를 보자.

어떤 클래스들에 대한 생성된 객체의 수를 추적하기를 희망한다고 생각해보자. 해당 기능이 필요한 모든 클래스들의 구현부에 기능을 추가하는 것은 꽤 귀찮은 일이 될것 같다. 이런 경우 위 예제처럼, 생성/복사/소멸에 대한 인터페이스를 포함하는 SomeBase 클래스를 구현하고, 기능이 필요한 클래스들을 인자로 입력 받아 상속하면 된다.

CRTP 개념을 몰라 정리할 겸 포스팅 했다. CRTP에 대해 깊이 공부하려면, 데코레이터(Decorator) 키워드로 찾아보면 될듯하다. 이후, 데코레이터 공부할때 한 번 더 정리해봐야겠다.

--

--