fork(7) 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. Cons<T, filter<Pred, Variadic, Ts...>::type>::type,
  29. 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. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:28:56: error: type/value mismatch at argument 2 in template parameter list for ‘template<template<class> class Pred, template<class ...> class Variadic, class T, class ... Ts> template<class, class> struct filter<Pred, Variadic, T, Ts ...>::Cons’
             Cons<T, filter<Pred, Variadic, Ts...>::type>::type,
                                                        ^
prog.cpp:28:56: error:   expected a type, got ‘filter<Pred, Variadic, Ts ...>::type’
prog.cpp:29:49: error: template argument 2 is invalid
             filter<Pred, Variadic, Ts...>::type >::type;
                                                 ^
prog.cpp:29:49: error: type/value mismatch at argument 3 in template parameter list for ‘template<bool <anonymous>, class, class> struct std::conditional’
prog.cpp:29:49: error:   expected a type, got ‘filter<Pred, Variadic, Ts ...>::type’
prog.cpp: In function ‘int main()’:
prog.cpp:34:19: error: ‘type’ is not a member of ‘filter<std::is_integral, std::tuple, int, float, long int>’
                   filter<std::is_integral, std::tuple, int, float, long>::type,
                   ^
prog.cpp:34:19: error: ‘type’ is not a member of ‘filter<std::is_integral, std::tuple, int, float, long int>’
prog.cpp:35:41: error: template argument 1 is invalid
                   std::tuple<int, long> >::value, "");
                                         ^
stdout
Standard output is empty