Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. /*template < class ... args >
  6. std::size_t find_size();
  7.  
  8. template < class arg1, args ... >
  9. std::size
  10. */
  11.  
  12. template < class ... Types >
  13. class Tuple;
  14.  
  15.  
  16. template< class Type1, class ... Types >
  17. class Tuple<Type1, Types...>
  18. {
  19. public:
  20.     Type1 element;
  21.     using TypeNext = Tuple < Types...>;
  22.     TypeNext next_elements;
  23.     Tuple() : element(Type1()), next_elements(Type_next()) {};
  24.     Tuple(const Type1& other_element, const Types&... other_elements) : element(other_element),
  25.         next_elements(other_elements...) {};
  26.     template < typename ... U>
  27.     Tuple(Type1&& other_element, U&&... other_elements) : element(std::forward<Type1>(other_element)),
  28.         next_elements(std::forward<U>(other_elements)...)) {};
  29.     Tuple(const Tuple<Type1, Types...>& tuple1) : element(tuple1.element),
  30.         next_elements(tuple1.next_elements) {};
  31.     Tuple(Tuple<Type1, Types...>&& tuple1) : element(std::move(tuple1.element)),
  32.         next_elements(std::move(tuple1.next_elements)) {};
  33.     Tuple& operator=(const Tuple<Type1, Types...>& tuple1)
  34.     {
  35.         element = tuple1.element;
  36.         next_elements = tuple1.next_elements;
  37.     }
  38.     Tuple& operator=(Tuple<Type1, Types...>&& tuple1)
  39.     {
  40.         element = std::move(tuple1.element);
  41.         next_elements = std::move(tuple1.next_elements);
  42.     }
  43.     ~Tuple<Type1, Types...>()
  44.     {
  45.         element.~();
  46.         next_elements.~();
  47.     }
  48.     void swap(Tuple<Type1, Types...>& tuple1)
  49.     {
  50.         Tuple<Type1, Types...> swap_tuple = std::move(this);
  51.         this = std::move(tuple1);
  52.         tuple1 = std::move(swap_tuple);
  53.     }
  54.     bool operator==(Tuple tuple1, Tuple tuple2);
  55. };
  56.  
  57. template < class Type1, class ... Types >
  58. Tuple<Type1, Types...> makeTuple(Type1&& arg, Types&&...  args)
  59. {
  60.     return Tuple(std::forward(arg), std::forward(args...));
  61. }
  62.  
  63. template < std::size_t element_number >
  64. auto get(Tuple<auto... types>& tuple1)->decltype(tuple)
  65. {
  66.     if (element_number == 1)
  67.     {
  68.         return tuple1.element;
  69.     }
  70.     else
  71.     {
  72.         return get<element_number - 1>(next_elements);
  73.     }
  74. }
  75.  
  76. template < std::size_t element_number >
  77. const auto& get(const Tuple<auto... types>& tuple1)->decltype(tuple)
  78. {
  79.     if (element_number == 1)
  80.     {
  81.         return tuple1.element;
  82.     }
  83.     else
  84.     {
  85.         return get<element_number - 1>(next_elements);
  86.     }
  87. }
  88.  
  89. template < std::size_t element_number >
  90. auto&& get(Tuple<auto... types>&& tuple1)
  91. {
  92.     if (element_number == 1)
  93.     {
  94.         return std::move(tuple1.element);
  95.     }
  96.     else
  97.     {
  98.         return std::move(get<element_number - 1>(next_elements));
  99.     }
  100. }
  101.  
  102. //auto&& get<1>(Tuple<auto... Types>&& tuple1)
  103. //{
  104. //  return std::move(tuple1.element);
  105. //}
  106.  
  107. template < typename T >
  108. T& get(Tuple& tuple1)
  109. {
  110.     if (decltype(T) == decltype(tuple1.element))
  111.     {
  112.         return tuple1.element;
  113.     }
  114.     else
  115.     {
  116.         return get<T>(tuple1.next_elements);
  117.     }
  118. }
  119.  
  120. template < typename T >
  121. const T& get(const Tuple& tuple1)
  122. {
  123.     if (decltype(T) == decltype(tuple1.element))
  124.     {
  125.         return tuple1.element;
  126.     }
  127.     else
  128.     {
  129.         return get<T>(tuple1.next_elements);
  130.     }
  131. }
  132.  
  133. template < typename T >
  134. T&& get(Tuple&& tuple1)
  135. {
  136.     if (decltype(T) == decltype(tuple1.element))
  137.     {
  138.         return tuple1.element;
  139.     }
  140.     else
  141.     {
  142.         return get<T>(std::move(tuple1.next_elements));
  143.     }
  144. }
  145.  
  146. bool Tuple::operator==(Tuple tuple1, Tuple tuple2)
  147. {
  148.  
  149. }
  150.  
  151. auto tupleCat(Tuple tuple1, )
  152. {
  153.  
  154. }
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. template <>
  165. class Tuple<>
  166. {
  167. public:
  168.     Tuple()
  169.     {
  170.  
  171.     }
  172. };
  173.  
  174. template < class Type1, class... Types>
  175. bool operator==(Tuple<Type1, Types...>& tuple1, Tuple<Type1.Types...>& tuple2)
  176. {
  177.     return (tuple1.element == tuple2.element && tuple1.tuple == tuple2.tuple);
  178. }
  179.  
  180. //template < typename T >
  181. //void get()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement