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.  
  13. template <typename T, typename U>
  14. class join;
  15.  
  16. template <typename ...Elems>
  17. class join<set<>, set<Elems...>> {
  18. public:
  19. typedef set<Elems...> type;
  20. };
  21.  
  22. template <typename Elem1, typename ...Elems, typename ...Elems2>
  23. class join<set<Elem1, Elems...>, set<Elems2...>> {
  24. public:
  25. typedef typename join<set<Elems...>, set<Elem1, Elems2...>>::type type;
  26. };
  27.  
  28.  
  29. template <typename T, typename U>
  30. class all_subsets_worker;
  31.  
  32. template <typename Rest>
  33. class all_subsets_worker<set<>, Rest>
  34. {
  35. public:
  36. typedef set<Rest> type;
  37. };
  38.  
  39. template <typename Elem, typename Rest, typename ...Elems>
  40. class all_subsets_worker<set<Elem, Elems...>, Rest>
  41. {
  42. public:
  43. typedef typename join<
  44. typename all_subsets_worker<set<Elems...>, Rest>::type,
  45. typename all_subsets_worker<set<Elems...>, typename join< set<Elem>, Rest>::type >::type
  46. >::type type;
  47. };
  48.  
  49. template <typename T>
  50. class all_subsets;
  51.  
  52. template <typename Elem, typename ...Elems>
  53. class all_subsets<set<Elem, Elems...>> {
  54. public:
  55. typedef typename all_subsets_worker<set<Elem, Elems...>, set<>>::type type;
  56. };
  57.  
  58. int main(int argc, const char * argv[])
  59. {
  60. auto t = all_subsets<set<element<0>, element<1>, element<2>, element<3>>>::type();
  61.  
  62. double u = t;
  63.  
  64. // insert code here...
  65. std::cout << "Hello, World!\n";
  66. return 0;
  67. }
  68.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function 'int main(int, const char**)':
prog.cpp:62:16: error: cannot convert 'set<set<element<3u>, element<2u>, element<1u> >, set<element<2u>, element<1u> >, set<element<1u> >, set<element<3u>, element<1u> >, set<element<3u> >, set<>, set<element<2u> >, set<element<3u>, element<2u> >, set<element<3u>, element<2u>, element<0u> >, set<element<2u>, element<0u> >, set<element<0u> >, set<element<3u>, element<0u> >, set<element<3u>, element<1u>, element<0u> >, set<element<1u>, element<0u> >, set<element<2u>, element<1u>, element<0u> >, set<element<3u>, element<2u>, element<1u>, element<0u> > >' to 'double' in initialization
stdout
Standard output is empty