템플릿 메타 프로그래밍 ( Template Meta Programming, TMP)
: 타입을 이용해 컴파일 타임에 생성되는 코드로 프로그래밍 하는 것
*템플릿을 이용하면 타입 자체에 어떠한 값을 부여할 수 있고(제네릭 프로그래밍 이용), 그 타입을 가지고 연산도 가능
일반화 프로그래밍 (generic programming)(제너릭 프로그래밍)
:타입이 인자인것처럼 사용
*템플릿에는 타입뿐만이 아닌 값들도 올 수 있다.
#include <iostream>
template <typename T, unsigned int N>
class Array {
T data[N];
public:
// 배열을 받는 레퍼런스 arr
Array(T (&arr)[N]) {
for (int i = 0; i < N; i++) {
data[i] = arr[i];
}
}
T* get_array() { return data; }
unsigned int size() { return N; }
void print_all() {
for (int i = 0; i < N; i++) {
std::cout << data[i] << ", ";
}
std::cout << std::endl;
}
};
int main() {
int arr[3] = {1, 2, 3};
// 배열 wrapper 클래스
Array<int, 3> arr_w(arr);
arr_w.print_all();
}
Array<int, 3> arr_w(arr);
템플릿 메타 프로그래밍을 사용하는 이유
: 컴파일 타임에 모든 연산이 끝나므로 실행속도가 빠르다.(컴파일 타임은 늘어남)
*컴파일 타임에 연산하기 때문에 디버깅이 힘들다.(구현도 굉장히 어려움)
의존타입 (dependent type)
:템플릿의 인자에 따라 타입이 달라질 수 있는 것
타입을 의도 한다면 반드시 typename 키워드를 붙여줘야함
*의존 값의 경우 컴파일러는 식별자를 기본적으로 값으로 생각함