This should be pretty straight forward. At heart you should have something like this:
template <typename...> struct filter; template <> struct filter<> { using type = std::tuple<>; }; template <typename Head, typename ...Tail> struct filter<Head, Tail...> { using type = typename std::conditional<Predicate<Head>::value, typename Cons<Head, typename filter<Tail...>::type>::type, typename filter<Tail...>::type >::type; };
You just need Cons<T, Tuple> , which turns T, std::tuple<Args...> into std::tuple<T, Args...> , and you need to pass the predicate (left as an exercise). Cons might look like this:
template <typename, typename> struct Cons; template <typename T, typename ...Args> struct Cons<T, std::tuple<Args...>> { using type = std::tuple<T, Args...>; };
The result of filter<Args...>::type will be std::tuple<Brgs...> , where Brgs... is a package consisting only of those types in Args... for which the predicate is executed.
source share