Template MetaProgramming(TMP)
템플릿 메타프로그래밍(template metaprogramming)은 템플릿을 사용하는 프로그래밍 기법으로, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다.
이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점의 계산을 줄여준다. 이 기법은 C++ 프로그래밍 언어에서 주로 사용된다1. C#에서 비슷한 기능으로는 제네릭 특수화 (Generic Specialization), 소스 생성기 (Source Generators)를 이용 TMP처럼 “컴파일러가 코드를 생성하게 만든다”
TMP는 버그를 찾기 쉽지도 않고 구현도 어렵지만, 사용하는 이유는 많은 C++ 라이브러리들이 TMP 를 이용해서 구현되었고, TMP 를 통해서 컴파일 타임에 여러 오류들을 잡아낼 수도 있으며 속도가 매우 중요한 프로그램의 경우 TMP 를 통해서 런타임 속도도 향상2 시킬 수 있기 때문이다.
아래의 예제는 콜라츠 추측(Collatz)을 C#과 C++ 언어로 각각 구현한 예제3를 보여주고 TMP를 사용한 C++의 소스가 컴파일 타임에서 C#과 어떠한 차이가 있는지 보여준다.
1
2
3
4
5
6
7
int factorial(int n) {
if (n == 0)
return 1;
return n * factorial(n - 1);
}
// factorial(4) == (4 * 3 * 2 * 1) == 24
// factorial(0) == 0! == 1
1
2
3
4
5
6
7
8
9
10
11
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1