Advertisement
Guest User

TupleList example

a guest
May 29th, 2025
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | Source Code | 0 0
  1. #include <type_traits>
  2.  
  3.  
  4. template <typename...>
  5. struct Tuple;
  6.  
  7. // base case specialization
  8. template<>
  9. struct Tuple<>{
  10.         static void loop(Tuple<>& tuple, auto&& func, size_t idx){}
  11.         static size_t hash(Tuple<>& tuple){ return 0;}
  12. };
  13.  
  14. // recursive case specialization
  15. template <typename T, typename... Rem>
  16. struct Tuple<T, Rem...>: Tuple<Rem...>{
  17.         T val;
  18.         // copy constructor
  19.         Tuple(const Tuple&) = default;
  20.         Tuple<T, Rem...>(T head, Tuple<Rem...> tail): Tuple<Rem...>(tail), val(head){}
  21.         Tuple<T, Rem...>(T head, Rem... tail): Tuple<Rem...>(tail...), val(head){}
  22.         static void loop(Tuple<T, Rem...>& tuple, auto&& func, size_t idx){
  23.                 func(idx, tuple.val);
  24.                 Tuple<Rem...>::loop(tuple, func, idx+1);
  25.         }
  26.         static size_t hash(Tuple<T, Rem...>& tuple){
  27.                 size_t hash = std::hash<T>()(tuple.val);
  28.                 return hash ^ Tuple<Rem...>::hash(tuple);
  29.         }
  30. };
  31.  
  32. template <size_t idx, typename TupleType>
  33. struct TupleElem;
  34.  
  35. template <typename T, typename... Rem>
  36. struct TupleElem<0, Tuple<T, Rem...>>{
  37.         using type = T;
  38.         static T& get(Tuple<T, Rem...>& tuple){
  39.                 return tuple.val;
  40.         }
  41. };
  42.  
  43. template <size_t idx, typename T, typename... Rem>
  44. struct TupleElem<idx, Tuple<T, Rem...>>{
  45.         using type = typename TupleElem<idx-1, Tuple<Rem...>>::type;
  46.         static type& get(Tuple<T, Rem...>& tuple){
  47.                 return TupleElem<idx-1, Tuple<Rem...>>::get(tuple);
  48.         }
  49. };
  50.  
  51. template<size_t idx, typename T, typename... Rem>
  52. typename TupleElem<idx, Tuple<T, Rem...>>::type get(Tuple<T, Rem...>& tuple){
  53.         return TupleElem<idx, Tuple<T, Rem...>>::get(tuple);
  54. }
  55.  
  56. template<typename T, typename... Rem>
  57. static void loop(Tuple<T, Rem...>& tuple, auto&& func){
  58.         size_t idx = 0;
  59.         func(idx, tuple.val);
  60.         return Tuple<Rem...>::loop(tuple, func, idx+1);
  61. }
  62.  
  63. template<typename T, typename... Rem>
  64. static size_t hash(Tuple<T, Rem...>& tuple){
  65.         size_t hash = std::hash<T>()(tuple.val);
  66.         return hash ^ Tuple<Rem...>::hash(tuple);
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement