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

型リストの全ての型が述語を満たす場合はtrue
述語を満たさない型があった場合はfalseを返すメタ関数です。

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

template <template <class T> class P, class Head, class... Tail>
struct all<P, tuple<Head, Tail...>> {
    static const bool value = !P<Head>::value ?
                                  false :
                                  all<P, tuple<Tail...>>::value;
};

template <template <class T> class P>
struct all<P, tuple<>> {
    static const bool value = true;
};
all<is_integral, tuple<int, long, char>>::value
→ true
all<is_integral, tuple<int, double, char>>::value
→ false