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

drop_whileは先頭から述語を満たす型を除外するメタ関数です。

template <bool Cond, class Then, class Else>
struct if_c;

template <class Then, class Else>
struct if_c<true, Then, Else> {
    typedef Then type;
};

template <class Then, class Else>
struct if_c<false, Then, Else> {
    typedef Else type;
};


template <template <class T> class P, class Seq>
struct drop_while;

template <template <class T> class P, class Head, class... Tail>
struct drop_while<P, tuple<Head, Tail...>> {
    typedef
        typename if_c<P<Head>::value,
                      typename drop_while<P, tuple<Tail...>>::type,
                      tuple<Head, Tail...>
                 >::type
    type;
};

template <template <class T> class P>
struct drop_while<P, tuple<>> {
    typedef tuple<> type;
};
drop_while<is_integral, tuple<int, long, char, double>>::type
→ tuple<double>