[C++] 템플릿 패턴: CRTP
CRTP는 흥미롭게 반복되는 템플릿 패턴(curiously recurring template pattern)의 줄임말이다.
이 패턴의 기본 원칙은, 상위 클래스에서 자신의 하위 클래스를 템플릿 인자로 전달받는 것이다.
그래서 반복된다고 표현한 것이다.
다형성?
이건 템플릿을 이용해서 가상함수 없이도 다형성을 어느정도 흉내낼 수 있게 해준다.
당연히 런타임 다형성은 기대하면 안되고... 그냥 끝까지 템플릿으로 쥐어짜면서 정적 다형성만을 좀더 그럴듯하게 꾸며주는 거다.
상위 클래스는 템플릿 클래스로 선언되며, 템플릿 인자로 하위 클래스의 타입을 받는다!
그리고 상위 클래스에서 하위 클래스로 캐스팅해 하위의 멤버를 호출하도록 하면 된다.
코드를 봐보자.
일단 인터페이스 비슷하게 Runnable 하나를 만들었다. run 메소드 하나만을 가진다.


그리고 저걸 구현하는 클래스를 2개 짜봤다.
Runnable을 상속하며, 템플릿 인자로 자기 자신을 준다.
그래서 흥미롭게 반복되는 템플릿(CRT)이란 것이다.


그럼 이런식으로 쓸 수 있는 거다.

근데 저러기만 하면 쓸모가 없으니, 함수템플릿 등을 이용할 일이 있어야 좀더 그럴듯한 코드가 될 것이다.

뭐 대충 이렇다.
근데 저런 식으로 쓸 일은 거의 없을거다.
가상함수 그거 비용 얼마나 된다고 꼭 이래야겠는가.
이 템플릿 패턴이 좀더 유용한 경우는, 정적메서드나 정적멤버변수를 집어넣을 때다.
기본적으로 클래스를 상속받으면, 그 정적멤버변수는 전부 공유하게 된다. 정적이니까!
하지만 클래스 템플릿의 정적멤버변수는 다르다. 구체화될때마다 구체화된 해당 클래스에 새로운 정적멤버변수가 설정된다.
이를 이용해서 사용되는 것 중 하나가 오브젝트 카운터라는 것이다.
오브젝트 카운터
딱히 그렇게 복잡한건 없다.
카운터를 클래스 템플릿으로 선언. count 변수를 정적변수로 선언해서 새로운 타입으로 상속할때마다 해당 타입의 카운터가 생성되게 한다.
그리고 생성자와 소멸자를 통해 해당 클래스의 객체 생성과 소멸을 추적하면 된다.


추적이 필요한 클래스는, 저걸 상속만 하면 된다.


그럼 잘 동작할 것이다.


대충 이런식으로 응용하면 된다.
근데 그렇게 쓸일이 많진 않을것같다.
참조
https://en.m.wikipedia.org/wiki/Curiously_recurring_template_pattern