템플릿 메타프로그래밍 연습 #4-1 코드

알고리즘 자체는 학부 2학년 수준입니다. 딱 보면 idiom이 보일 정도로 코드를 썼습니다. (Modern C++ Design을 참고했습니다.) 한 번 죽 내려가면서 읽어보기만 해도 이해하시리라 믿습니다. 그나저나 이런걸 만들어서 대체 어디에 써먹냐. 그냥 지적 유희가 아니냐라고 물어볼 수 있겠습니다만. 그러니까 최적화 할 기회는 단지 포인터냐 아니냐에만 있는 것이 아니란 말이지요. 결국 이 타입이 어떤 분류에 속하는가에 따라 찍어내야 할 코드가 달라지게 됩니다. 그 때마다 일일이 길다랗게 코딩하는 삽질을 할 수는 없고, 이렇게 적당히 타입목록을 몇가지 만들어놓고 이 타입이 해당 카테고리에 있는지 확인하려면 그냥 메타함수를 호출하면 됩니다. 어차피 Boost MPL 라이브러리에 다 있습니다만, 한 번 이렇게 써보면 내부 동작도 잘 이해할 수 있으니까요.

길어서 안 올라가길래 세 부분으로 쪼갰습니다. (..);;
그나저나 너저분하게 보이는 것은 어쩔 수가 없군요. 이렇게 SNR이 낮아서야 orz

class null_type {};

template <typename T, typename U>
struct type_list
{
    typedef T head;
    typedef U tail;
};

namespace tl
{
    // is same type?
    template <class T, class U>
    struct is_same
    {
        enum { value = 0 };
    };

    template <class T>
    struct is_same<T, T>
    {
        enum { value = 1 };
    };
    
    // length of type list
    template <typename List> struct length;

    template <> struct length<null_type>
    {
        enum { value = 0 };
    };

    template <typename T, typename U>
    struct length<type_list<T, U> >
    {
        enum { value = 1 + length<U>::value };
    };

    // access element using index of type list
    template <typename List, unsigned int i> struct at;
    
    template <typename Head, typename Tail>
    struct at<type_list<Head, Tail>, 0>
    {
        typedef Head result;
    };

    template <typename Head, typename Tail, unsigned int i>
    struct at<type_list<Head, Tail>, i>
    {
        typedef typename at<Tail, i-1>::result result;
    };
    
    // find type
    template <typename List, typename T> struct find;
    
    template <typename T>
    struct find<null_type, T>
    {
        enum { value = -1 };
    };

    template <typename T, typename Tail>
    struct find<type_list<T, Tail>, T>
    {
        enum { value = 0 };
    };

    template <typename Head, typename Tail, typename T>
    struct find<type_list<Head, Tail>, T>
    {
        private:
            enum { temp = find<Tail, T>::value };
        public:
            enum { value = (temp == -1) ? -1 : 1 + temp };
    };

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://www.xeraph.com/tb/382987 [도움말]

덧글

  • 電腦人間 2005/07/24 15:23 # 답글

    이걸 써봐야 손에 익을 텐데, 써볼 일이 없네요.
  • J.Min 2005/07/26 00:59 # 삭제 답글

    나는 학부 2학년도 안되는가보아.. 훌쩍.
댓글 입력 영역