정의
- Compile-time 재귀(recursion)를 사용해서 임의의 연산을 수행하는 기술
- 재귀의 종료를 위해 템플릿 전문화 기술을 사용
- ex) C++11의 std::chrono, Intel TBB, ...
// primary template
template<int N> struct Factorial
{
enum { kValue = N*Factorial<N-1>::kValue };
};
// 재귀의 종료를 위해서 전문화한다.
template<> struct Factorial<1>
{
enum { kValue = 1 };
};
int main(int argc, char* argv[])
{
cout << Factorial<5>::kValue << endl; //< 120
return 0;
}
과제로 나왔던 Binary 메타함수의 구현
- binary --> decimal로 변환
- 유효하지 않은 값이 들어왔을 땐 컴파일 에러 발생시킴
template<int N> struct Binary
{
private:
// 각 자리값의 유효성을 확인하기 위한 template
template<int N> struct Bit;
template<> struct Bit<0>
{
enum { kValue = 0 };
};
template<> struct Bit<1>
{
enum { kValue = 1 };
};
public:
enum
{
kValue = 2*Binary<N/10>::kValue + Bit<n % 10>::kValue
};
};
// 연산 종료조건은 전문화를 이용한다.
template<> struct Binary<0>
{
enum { kValue = 0 };
};
int main(int argc, char* argv[])
{
cout << Binary<1101>::kValue << endl; //< 13
// cout << Binary<153>::kValue << endl; //< compile-error
return 0;
}
'NC University > Advanced C++' 카테고리의 다른 글
| 2일차 - Template 부분 전문화(2) (0) | 2015.06.30 |
|---|---|
| 2일차 - 템플릿 인자 (0) | 2015.06.30 |
| 2일차 - value_type (0) | 2015.06.29 |
| 2일차 - 멤버함수 템플릿 (0) | 2015.06.24 |
| 1일차 - new에 대해서 (0) | 2015.06.19 |