可変引数テンプレートでの型リスト - headとtail

可変引数テンプレートによる型リストでリスト処理作っていこうと思います。


手始めに、型リストの先頭を取り出すheadと、後部を取り出すtailです。

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

template <class Head, class... Tail>
struct head<tuple<Head, Tail...>> {
    typedef Head type;
};
head<int, double, long>::type
→ int
head<tuple<int, double, long>>::type
→ int
template <class... Args>
struct tail;

template <class Head, class... Tail>
struct tail<tuple<Head, Tail...>> {
    typedef tuple<Tail...> type;
};
tail<tuple<int, double, long>>::type
→ tuple<double, long>

メタ関数の戻り値の型を可変長にするために、tuple使ってます。