階層化された型リスト

先日、id:test_voidさんの話を聞いて、型リストのためのメタ関数をネストするのはおもしろいなーと思ったので可変引数テンプレートでやってみました。


用意したのは、head、tail、mapの3つです。

template <class... Args>
class type_list {
    template <class>
    struct head_;

    template <class Head, class... Tail>
    struct head_<type_list<Head, Tail...>> {
        typedef Head type;
    };

    template <class>
    struct tail_;

    template <class Head, class... Tail>
    struct tail_<type_list<Head, Tail...>> {
        typedef type_list<Tail...> type;
    };
public:
    typedef type_list<Args...> type;
    typedef typename head_<type_list<Args...>>::type head;
    typedef typename tail_<type_list<Args...>>::type tail;

    template <template <class> class F>
    struct map {
        typedef type_list<typename F<Args>::type...> type;
    };
};

こんな感じで使います。

template <class T>
struct add_ptr {
    typedef T* type;
};

typedef type_list<int, char, double>::tail::map<add_ptr>::type::head type;
    // typeの型はchar*

type_listメタ関数内にtype_list自身を操作するメタ関数を定義してあげれば
連続したメタ関数の適用が簡単に書けますね。