leesangwon0114

I am Research Engineer. Currently working in KT.

C++Template 13. Template meta programming

14 Aug 2018 » c++

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.

template meta programming


#include <iostream>
using namespace std;

// template meta programming
tempalte<int N> struct factorial
{
	// enum {value = N*factorial<N-1>::value};
	static constexpr int value = N*factorial<N-1>::value
}

// 재귀의 종료를 위해 특수화 문법 사용
tempalte<> struct factorial<1>
{
	// enum {value = 1};
	static constexpr int value = 1
}

int main()
{
	int n = factorial<5>::value;

	// 5 * f<4>::value
	// 	   4 * f<3>::value
	//		   3 * f<2>::value
	//			   2 * f<1>::value

	cout << n << endl;	// 120
}

template 이 풀리는 것은 컴파일 시간임

컴파일 시간에 최종적으로 120을 구함

컴파일 타임에 연산하는 프로그래밍을 template meta programming 이라함

재귀를 사용하는 것이 핵심인데 재귀의 종료를 위해 특수화 문법 사용

C++11에 constexpr 이 나오면서 구조체에 enum대신 constexpr 사용


constexpr

template<int N> struct check{};

// constexpr 함수 - c++11

constexpr int add(int a, int b)
{
	return a+b;
}

int main()
{
	int n = add(1,2);

	check<add(1,2)> c;	// 실행시간이면 error 지만 컴파일 시간이면 ok;

	int n1 = 1, n2 = 2;

	int c = add(n1, n2); // ok
	check<add(n1, n2)> c; // error
}

컴파일 시간이 컴파일 상수를 주면 컴파일 시간에 계산하고 일반 변수를 주면 실행시간에 계산됨