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

filterの実装用メタ関数。


パラメータで受け取った述語(メタ関数)がtrueを返す場合に、
型リストに型を追加するメタ関数です。

template <bool B, class T, class Seq>
struct add_if_c;

template <class T, class... Seq>
struct add_if_c<true, T, tuple<Seq...>> {
    typedef tuple<Seq..., T> type;
};

template <class T, class... Seq>
struct add_if_c<false, T, tuple<Seq...>> {
    typedef tuple<Seq...> type;
};

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

template <template <class> class P, class T, class... Seq>
struct add_if<P, T, tuple<Seq...>> :
    public add_if_c<P<T>::value, T, tuple<Seq...>> {};
typedef add_if<is_integral, int, tuple<long, double>>::type type;
→ tuple<long, double, int>
typedef add_if<is_integral, double, tuple<long, double>>::type type;
→ tuple<long, double>


GCC 4.4でこれができなかった。

template <template <class> class P, class T, class... Seq>
struct add_if : public add_if_c<P<T>::value, T, Seq...> {}; // エラー!sorry not implement