본문 바로가기
NC University/Advanced C++

1일차 - Template meta programming

by 날쑤 2015. 6. 18.

정의

  • 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