fork(3) download
  1. #include <tuple>
  2. #include <type_traits>
  3.  
  4. template <template <class> class,
  5. template <class...> class,
  6. class...>
  7. struct filter;
  8. template <template <class> class Pred, template <class...> class Variadic>
  9. struct filter<Pred, Variadic>
  10. {
  11. using type = Variadic<>;
  12. };
  13.  
  14. template <template <class> class Pred,
  15. template <class...> class Variadic,
  16. class T, class... Ts>
  17. struct filter<Pred, Variadic, T, Ts...>
  18. {
  19. template <class, class> struct Cons;
  20. template <class Head, class... Tail>
  21. struct Cons<Head, Variadic<Tail...> >
  22. {
  23. using type = Variadic<Head, Tail...>;
  24. };
  25.  
  26. using type = typename std::conditional<
  27. Pred<T>::value,
  28. typename Cons<T, typename filter<Pred, Variadic, Ts...>::type>::type,
  29. typename filter<Pred, Variadic, Ts...>::type >::type;
  30. };
  31.  
  32. int main() {
  33. static_assert(std::is_same<
  34. filter<std::is_integral, std::tuple, int, float, long>::type,
  35. std::tuple<int, long> >::value, "");
  36. }
Success #stdin #stdout 0s 4492KB
stdin
Standard input is empty
stdout
Standard output is empty