fork download
  1. // Generic TMP-Library
  2.  
  3. template <typename T> struct identity_ { using type = T; };
  4. template <typename... T> struct type_list { using type=type_list; };
  5.  
  6. template <int N, int... i>
  7. struct make_index_list_ : make_index_list_<N-1, 0, (1+i)...> {};
  8. template <int N>
  9. using make_index_list = typename make_index_list_<N>::type;
  10. template <int... i>
  11. struct make_index_list_<0, i...> : type_list<std::integral_constant<int, i>...> {};
  12.  
  13. template <typename TL>
  14. struct size_;
  15. template <typename TL>
  16. using size = typename size_<TL>::type;
  17. template <typename... T>
  18. struct size_<type_list<T...>>
  19. : std::integral_constant<int, sizeof...(T)> {};
  20.  
  21. template <typename TL, template <typename> class F>
  22. struct transform_;
  23. template <typename TL, template <typename> class F>
  24. using transform = typename transform_<TL, F>::type;
  25. template <typename... T, template <typename> class F>
  26. struct transform_<type_list<T...>, F>
  27. : type_list<typename F<T>::type...> {};
  28.  
  29. template <typename, typename, template <typename> class> struct filter_;
  30. template <typename... L, typename M, typename... R, template <typename> class Pred>
  31. struct filter_<type_list<L...>, type_list<M, R...>, Pred>
  32. : std::conditional<Pred<M>::value,
  33. filter_<type_list<L..., M>, type_list<R...>, Pred>,
  34. filter_<type_list<L...>, type_list<R...>, Pred> >::type {};
  35. template <typename TL, template <typename> class Pred>
  36. struct filter_<TL, type_list<>, Pred> : identity_<TL> {};
  37. template <typename TL, template <typename> class Pred>
  38. using filter = typename filter_<type_list<>, TL, Pred>::type;
  39.  
  40. template <template<typename,typename>class F, typename TL, typename TL2> struct zip_with_;
  41. template <template<typename,typename>class F, typename TL, typename TL2>
  42. using zip_with = typename zip_with_<F, TL, TL2>::type;
  43. template <template<typename,typename>class F, typename... Ts, typename... Us>
  44. struct zip_with_<F, type_list<Ts...>, type_list<Us...> >
  45. : type_list<typename F<Ts, Us>::type...> {};
  46.  
  47. template <template<typename>class P>
  48. struct static_not {
  49. template <typename T>
  50. using action = std::integral_constant<bool, !P<T>::value>;
  51. };
  52.  
  53. struct expression_sequence{template<typename...T>expression_sequence(T&&...){}};
  54.  
  55. // Subsets (eigentlicher Code ab hier)
  56. #include <iostream>
  57.  
  58. template <int I> using element = std::integral_constant<int, I>; // für tmper
  59.  
  60. template <typename TL> struct go {
  61. template <typename I> struct go2 {
  62. template <typename J, typename T> struct go3
  63. : std::conditional<static_cast<bool>(I::value & (1 << J::value)), T, void> {};
  64. using type = filter<zip_with<go3, make_index_list<size<TL>::value>, TL>,
  65. static_not<std::is_void>::template action>;
  66. };
  67. };
  68.  
  69. template <typename... E>
  70. using all_subsets = transform<make_index_list<(1<<(sizeof...(E)))>, go<type_list<E...> >::template go2>;
  71.  
  72. template <typename T> struct print_ { static void print(std::ostream& os) { os << T::value; } };
  73. template <typename... Ts> struct print_<type_list<Ts...> > {
  74. static void print(std::ostream& os)
  75. { os << "{ "; (void)expression_sequence((print_<Ts>::print(os),os<<' ')...); os << "}"; }
  76. };
  77. template <typename TL> void print(std::ostream&os=std::cout) { print_<TL>::print(os);os<<'\n'; }
  78.  
  79. int main()
  80. {
  81. print<all_subsets<element<0>, element<1>, element<2>>>();
  82. print<all_subsets<>>();
  83. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty