fork download
  1. #include <iostream>
  2.  
  3. template <unsigned N>
  4. class element {
  5. public:
  6. const static unsigned value = N;
  7. };
  8.  
  9. template <typename ...Elems>
  10. class set{};
  11.  
  12. template <typename ...Elems>
  13. void print(set<Elems...> t) {
  14. std::cout << "{";
  15. t.print();
  16. std::cout << "}";
  17. }
  18.  
  19. template <unsigned N>
  20. void print(element<N> t)
  21. {
  22. std::cout << N;
  23. }
  24.  
  25. template <typename Elem, typename ...Elems>
  26. class set<Elem, Elems...> {
  27. public:
  28. static void print()
  29. {
  30. ::print(Elem());
  31. std::cout << ", ";
  32. set<Elems...>::print();
  33. }
  34. };
  35.  
  36. template <typename Elem>
  37. class set<Elem> {
  38. public:
  39. static void print()
  40. {
  41. ::print(Elem());
  42. }
  43. };
  44.  
  45. template <>
  46. class set<> {
  47. public:
  48. static void print(){}
  49. };
  50.  
  51. template <typename T, typename U>
  52. class join;
  53.  
  54. template <typename ...Elems>
  55. class join<set<>, set<Elems...>> {
  56. public:
  57. typedef set<Elems...> type;
  58. };
  59.  
  60. template <typename Elem1, typename ...Elems, typename ...Elems2>
  61. class join<set<Elem1, Elems...>, set<Elems2...>> {
  62. public:
  63. typedef typename join<set<Elems...>, set<Elem1, Elems2...>>::type type;
  64. };
  65.  
  66.  
  67. template <typename T, typename U>
  68. class all_subsets_worker;
  69.  
  70. template <typename Rest>
  71. class all_subsets_worker<set<>, Rest>
  72. {
  73. public:
  74. typedef set<Rest> type;
  75. };
  76.  
  77. template <typename Elem, typename Rest, typename ...Elems>
  78. class all_subsets_worker<set<Elem, Elems...>, Rest>
  79. {
  80. public:
  81. typedef typename join<
  82. typename all_subsets_worker<set<Elems...>, Rest>::type,
  83. typename all_subsets_worker<set<Elems...>, typename join< set<Elem>, Rest>::type >::type
  84. >::type type;
  85. };
  86.  
  87. template <typename T>
  88. class all_subsets;
  89.  
  90. template <typename ...Elems>
  91. class all_subsets<set<Elems...>> {
  92. public:
  93. typedef typename all_subsets_worker<set<Elems...>, set<>>::type type;
  94. };
  95.  
  96.  
  97. int main(int argc, const char * argv[])
  98. {
  99. auto t = all_subsets<set<element<0>, element<1>, element<2>, element<3>>>::type();
  100. auto p = all_subsets<set<>>::type();
  101.  
  102. print(t);
  103.  
  104. std::cout << "\n";
  105.  
  106. print(p);
  107.  
  108. std::cout << "\n";
  109.  
  110. return 0;
  111. }
Success #stdin #stdout 0s 2932KB
stdin
Standard input is empty
stdout
{{3, 2, 1}, {2, 1}, {1}, {3, 1}, {3}, {}, {2}, {3, 2}, {3, 2, 0}, {2, 0}, {0}, {3, 0}, {3, 1, 0}, {1, 0}, {2, 1, 0}, {3, 2, 1, 0}}
{{}}