template으로 factorial 만들기
template<int N> struct factorial
{
enum { value = N * factorial<N-1>::value };
// static constexpr int value = N * factorial<N-1>::value;
// 아래도 동일한 표현이다.
};
// 재귀 종료를 위해 특스화 된 문법
template<> struct factorial<1>
{
enum { value = 1 };
// static constexpr int value = 1;
};
int main()
{
int n = factorial<5>::value;
// 컴파일 시간에 이 값이 결정됨을 기억하자. -> template meta programming이라 한다.
cout << n << endl;
}
참고) constexpr
template<int N> struct check {};
// 컴파일타임에 결정이 됨.
constexpr int add(int a, int b)
{
return a + b;
}
int main()
{
int n = add(1, 2);
check<add(1,2)> c; // okay
int n1 = 1;
int n2 = 2;
int nn = add(n1, n2); // okay
check<add(n1,n2)> c1; // error
}