템플릿 메타프로그래밍

C++에서, 템플릿 메타 프로그래밍은 템플릿을 이용하여 컴파일 타임에 코드를 생성하는 것 이다. 보통 함수형 프로그래밍 방식으로 개발하며, 일반화 프로그래밍이 가능하다는 장점이 있다.

예제

int Fibo(int n)// 재귀 함수
{
    if(n <= 1) return 1;
    return Fibo(n-1) + Fibo(n-2);
}

// 템플릿 메타 프로그래밍
template <int N>
struct Fibo
{
    enum{
        value = Fibo<N-1>::value + Fibo<N-2>::value
    }
}

template <>
struct Fibo<0>
{
    enum{
        value = 1
    }
}

template <>
struct Fibo<1>
{
    enum{
        value = 1
    }
}

재귀항수를 이용한 방법은 런타임에 콜스택을 늘려가며 계산해야 하지만, 템플릿 메타 프로그래밍을 이용한 방법은, N값이 컴파일타임에 결정된다면 컴파일타임에 Fibo<N>이 계산된다.

프로그래밍 방법

주로 재귀적 성질을 이용한 함수형 프로그래밍을 사용한다. 템플릿의 비 타입 인자에는 컴파일 타임에 값을 알 수 있는 값만 넣을 수 있다. 주의할 점 중 하나는, 상수 포인터는 비타입 인자가 될 수 있지만 const char*는 예외적인 경우가 있다. 비타입 인자가 const char*형일 때, 같은 문자열을 넣어도 주소값이 다를 수 있기 때문에, extern 키워드를 사용하거나 일종의 꼼수를 써야 한다.

위의 예제와 같이, 좀 더 일반적인 템플릿 인자(위에서는 template <int N> ~~)를 가진 형태와 경계 조건일 때의 인자(template<>~~)를 가진 형태로 나누어서 프로그래밍하게 되는데, 위쪽에 일반적인 형태를 선언한다.

추가바람