본문 바로가기
💻 programming/c++

[c++] template meta programming

by 연구원-A 2020. 12. 15.
반응형

Template Meta Programming

다음 c++ 프로그램의 동작을 예상해봅시다.

#include <iostream>
using namespace std;

template <int n> struct funStruct {
    enum { val = 2*funStruct <n-1>::val };
};

template<> struct funcStruct<0>
{
    enum {val = 1};
};

int main() [
    cout << funStruct<8>::val << endl;
}

Output: 256

이 프로그램은 2^8을 계산합니다. 정확히는 funStruct 구조체는 임의의 n에 대해 2^n을 계산하는 데 사용되는 것입니다. 그렇지만 위 소스코드의 특별한 점은 이러한 계산이 컴파일 시간에 수행된다는 점입니다.

템플릿 메타 프로그래밍 동작 방식

1. 비형식 파라미터 전달

데이터 타입이 아닌 값을 템플릿의 인자로 전달합니다

funStruct<0>::val

2. 컴파일 시간에 상수 대체

비형식 인자로 전달받은 값을 템플릿 인스턴스화할 때 상수로 대체합니다.

template<8> struct funStruct {
    enum { val = 2 * funstruct <8 - 1>::val; }
};

3. 새로운 템플릿 인스턴스 생성

상수로 대체하면서 다시 템플릿 인스턴스를 생성합니다.

enum { val * 2 funStruct <7>:: val; }

템플릿 메타 프로그래밍 특징

템플릿 프로그래밍은 런타임 시간을 줄이는 장점이 있습니다. (동시에 컴파일 시간은 길어짐) 그러나, 템플릿 프로그래밍은 디버깅이 어려워 실제 소스 코드에 적용하기는 어렵습니다. 그럼에도 불구하고 매우 흥미로운 컨셉이라고 생각합니다.

반응형

댓글