先日、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自身を操作するメタ関数を定義してあげれば
連続したメタ関数の適用が簡単に書けますね。