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