Guest User

Untitled

a guest
Mar 23rd, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. #include <tuple>
  2.  
  3. // Elements are the end points of a Widget hierarchy
  4. struct Element
  5. {
  6. using initer_t = int;
  7. Element( const initer_t pIniter )
  8. :data{ pIniter }
  9. {
  10. printf("Creating %in", data);
  11. }
  12. const initer_t data;
  13. };
  14.  
  15. // A Widget class stores any number of Elements and/or other Widget instances
  16. template<typename... Elems>
  17. struct Widget
  18. {
  19. using initer_t = std::tuple<typename Elems::initer_t...>;
  20. Widget( const initer_t pIniter )
  21. :elements{ pIniter }
  22. {}
  23. const std::tuple<Elems...> elements;
  24. };
  25.  
  26. int main()
  27. {
  28. using Button = Widget<Element, Element>;
  29. using ButtonList = Widget<Button, Button, Element>;
  30.  
  31. Button::initer_t basic_button_initer{ 0, 1 }; // presets for Buttons
  32. Button::initer_t other_button_initer{ 2, 3 };
  33.  
  34. ButtonList::initer_t buttonlist_initer{ basic_button_initer, other_button_initer, 4 }; //a preset for a ButtonList
  35.  
  36. ButtonList buttonlist{ buttonlist_initer };
  37. return 0;
  38. }
  39.  
  40. Creating 4
  41. Creating 3
  42. Creating 2
  43. Creating 1
  44. Creating 0
  45.  
  46. #include <tuple>
  47. #include <iostream>
  48.  
  49. #include <boost/fusion/adapted/std_tuple.hpp>
  50. #include <boost/fusion/algorithm/iteration/for_each.hpp>
  51.  
  52. int main()
  53. {
  54. auto a = std::make_tuple(true, 42, 3.14, "abc");
  55. boost::fusion::for_each(a, [](auto& value) {
  56. std::cout << value << 'n';
  57. });
  58. }
  59.  
  60. 1
  61. 42
  62. 3.14
  63. abc
  64.  
  65. #include <tuple>
  66.  
  67. template<typename... Elems>
  68. struct construct
  69. {
  70. template<size_t... Ns, typename Head, typename... Rest>
  71. static constexpr const std::tuple<Rest...>
  72. drop_head_impl( const std::index_sequence<Ns...> ns,
  73. const std::tuple<Head, Rest...> tup )
  74. {
  75. return std::tuple<Rest...>( std::get<Ns + 1u>( tup )... );
  76. }
  77.  
  78. template<typename Head, typename... Rest>
  79. static constexpr const std::tuple<Rest...>
  80. drop_head( const std::tuple<Head, Rest...> tup )
  81. {
  82. return drop_head_impl( std::make_index_sequence<sizeof...(Rest)>(), tup );
  83. }
  84.  
  85. template<typename Head>
  86. static constexpr const std::tuple<Head>
  87. func_impl( const std::tuple<typename Head::initer_t> initer )
  88. {
  89. return std::tuple<Head>( { std::get<0>( initer ) } );
  90. }
  91.  
  92. template<typename Head, typename Next, typename... Rest>
  93. static constexpr const std::tuple<Head, Next, Rest...>
  94. func_impl( const std::tuple<typename Head::initer_t, typename Next::initer_t, typename Rest::initer_t...> initer )
  95. {
  96. std::tuple<Head> head( { std::get<0>( initer ) } );
  97. return std::tuple_cat( head, func_impl<Next, Rest...>( drop_head(initer) ) );
  98. }
  99.  
  100. static constexpr const std::tuple<Elems...>
  101. func( const std::tuple<typename Elems::initer_t...> initer )
  102. {
  103. return func_impl<Elems...>( initer );
  104. }
  105. };
  106.  
  107. // Elements are the end points of a Widget hierarchy
  108. struct Element
  109. {
  110. using initer_t = int;
  111. Element( const initer_t pIniter )
  112. :data{ pIniter }
  113. {
  114. printf( "Creating %in", data );
  115. }
  116. const initer_t data;
  117. };
  118.  
  119. // A Widget class stores any number of Elements and/or other Widget instances
  120. template<typename... Elems>
  121. struct Widget
  122. {
  123. using initer_t = std::tuple<typename Elems::initer_t...>;
  124. Widget( const initer_t pIniter )
  125. :elements( construct<Elems...>::func( pIniter ) )
  126. {}
  127. const std::tuple<Elems...> elements;
  128. };
  129.  
  130. int main()
  131. {
  132. using Button = Widget<Element, Element>;
  133. using ButtonList = Widget<Button, Button, Element>;
  134.  
  135. Button::initer_t basic_button_initer{ 0, 1 }; // presets for Buttons
  136. Button::initer_t other_button_initer{ 2, 3 };
  137.  
  138. ButtonList::initer_t buttonlist_initer{ basic_button_initer, other_button_initer, 4 }; //a preset for a ButtonList
  139.  
  140. ButtonList buttonlist{ buttonlist_initer };
  141. return 0;
  142. }
Add Comment
Please, Sign In to add comment