Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <tuple>
  4.  
  5. template<typename T>
  6. struct depended_false : std::false_type { };
  7.  
  8. template<typename ... Ts>
  9. struct type_list
  10. {
  11. template<std::size_t N>
  12. using type_t = typename std::tuple_element<N, std::tuple<Ts...>>::type;
  13.  
  14. template<typename T, std::size_t N = 0>
  15. constexpr static std::size_t type_ndx()
  16. {
  17. if constexpr(N == sizeof...(Ts))
  18. static_assert(depended_false<T>::value, "Doesn't contain type");
  19. else if constexpr(std::is_same_v<T, type_t<N>>)
  20. return N;
  21. else
  22. return type_ndx<T, N + 1>();
  23. }
  24. };
  25.  
  26. template<typename T>
  27. struct tag
  28. {
  29. using value_t = typename T::value_t;
  30. tag() : init_value() { }
  31. template<typename TT> tag(TT&& __init) : init_value(std::forward<TT>(__init)) { }
  32. value_t init_value;
  33. };
  34.  
  35. template<typename ... TagTypes>
  36. struct tag_tuple : std::tuple<typename TagTypes::value_t...>
  37. {
  38. using base_type = std::tuple<typename TagTypes::value_t...>;
  39.  
  40. template<typename ... Ts>
  41. tag_tuple(Ts&& ... values)
  42. : base_type(std::forward<Ts>(values)...)
  43. { }
  44.  
  45. tag_tuple(tag<TagTypes>&& ... init_values)
  46. : base_type(std::move(init_values.init_value)...)
  47. { }
  48. };
  49.  
  50. template<typename ... TagTypes>
  51. tag_tuple(TagTypes&& ... Tags) -> tag_tuple<TagTypes...>;
  52.  
  53. template<typename Tag, typename ... TagTypes>
  54. typename Tag::value_t&
  55. get(tag_tuple<TagTypes...>& t)
  56. {
  57. return std::template get<type_list<TagTypes...>::template type_ndx<Tag>()>(t);
  58. }
  59.  
  60. using namespace std;
  61.  
  62. int main()
  63. {
  64. struct t1 { using value_t = float; };
  65. struct t2 { using value_t = float; };
  66.  
  67. tag_tuple ttt { tag<t1>(1.f), tag<t2>(2.f) };
  68.  
  69. cout << get<0>(ttt) << endl;
  70.  
  71. return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement