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

filterは型リストから条件にあった型を抽出するメタ関数です。
mapと同じく高階メタ関数になってます。

template <template <class T> class P, class Seq1, class Seq2>
struct filter_impl;

template <template <class T> class P, class... Seq, class Head, class... Tail>
struct filter_impl<P, tuple<Seq...>, tuple<Head, Tail...>> {
    typedef
        typename filter_impl<P,
                             typename add_if<P,
                                             Head,
                                             tuple<Seq...>>::type,
                             tuple<Tail...>>::type
    type;
};

template <template <class T> class P, class... Seq>
struct filter_impl<P, tuple<Seq...>, tuple<>> {
    typedef tuple<Seq...> type;
};


template <template <class T> class P, class... Seq>
struct filter;

template <template <class T> class P, class... Seq>
struct filter<P, tuple<Seq...>> {
    typedef typename filter_impl<P, tuple<>, tuple<Seq...>>::type type;
};
filter<is_integral, tuple<int, double, long>>::type
→ tuple<int, long>

filterの実装で使用しているadd_ifメタ関数はこれです。