템플릿 메타프로그래밍 (Template Metaprogramming)
https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%ED%83%80%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D - 위키피디아 '템플릿 메타프로그래밍'
템플릿 메타프로그래밍은 말 그대로 C++ 의 템플릿을 하나의 프로그래밍 언어로 생각하여 프로그래밍 하는 것이라고 보는게 좋습니다. C++ 의 주요 기능인 템플릿은 OS나 아키텍처에 종속되는 기능이 아니기 때문에 크로스 플랫폼에도 용이하기도 하면서 튜링 완전한 점에 있어서 아주 다양한 기능을 작성할수 있다는 점에 주목해야합니다.
위 코드는 템플릿 특수화를 이용하여 가장 간단하게 구현해본 템플릿 인수로 넘겨진 타입이 int 인지 식별하는 메타 함수 'is_int'를 구현해본 코드입니다. is_int 의 구현부를 보면 아무리 봐도 런타임에 관여할 부분은 없다고 생각이 드실것 같다고 생각된다면 맞습니다. is_int 코드는 절대 런타임 오버헤드가 발생하지 않습니다. 그저 컴파일 타임에 정해지는 값이기 때문입니다. 이처럼 템플릿 메타프로그래밍은 런타임에 관여하지 않고 컴파일 타임에 연산을 수행하기 때문에 RTTI 보다는 저렴하며 여타 OS를 지원하기도 굉장히 쉽습니다.
하지만 천하의 템플릿 메타프로그래밍에도 치명적인 단점은 존재합니다. 예를 들자면 이렇습니다 :
- 가독성에 있어 심하게 문제가 발생합니다.
'엥? 그냥 구조체에 열거자 넣은게 뭐가 어때서..' 하시는 분들이 있으실지도 모르지만 나중에 배우시게 될 if_ 와 같은 템플릿 메타 함수는 구현하는데에는 큰 문제가 없지만 메타 함수를 호출하는데에 있어 크게 문제가 발생합니다. 곧 그 가독성의 블랙홀에 빠지시게 될것입니다. (너무 가독성의 구멍이라 헤어나올수가 없..)
- 컴파일러에 심하게 의존적입니다.
- 컴파일 시간이 증가할 수도 있습니다.
- (연산의 경우) 모든 연산은 상수식일 수 밖에 없습니다.
다음 글에서는 템플릿 메타프로그래밍을 실제로 사용하는 법과 직접 구현해보도록 하겠습니다. 정적 다형성(static polymorphism)을 이용한 분기나, 템플릿 타입을 가지고 노는 여러 메타 함수 부터 시작하여 템플릿 메타프로그래밍을 실전에 써먹어보면서 독자분들로 하여금 영감을 얻으실수 있도록 도와드리는 시간을 가질수 있도록 연재해보겠습니다.
'프로그래밍' 카테고리의 다른 글
The Modernest C++ #3 - 수학 라이브러리 (0) | 2016.01.04 |
---|---|
The Modernest C++ #2 - 타입을 가지고 놀아보기, type_traits (5) | 2015.10.28 |
The Modernest C++ #0 - 시작하며 (4) | 2015.10.06 |
구조체 멤버 정렬 (Struct Member Alignment) (0) | 2015.08.04 |
차세대 그래픽 API (0) | 2015.02.24 |