NC University/Advanced C++
1일차 - Template meta programming
날쑤
2015. 6. 18. 13:48
정의
- 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;
}