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;
}