fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <string>
  4. #include <vector>
  5.  
  6. template<typename... T> class tuple;
  7. template<> class tuple<> {};
  8. template<typename H, typename... T>
  9. class tuple<H, T...> : private tuple<T...>
  10. {
  11. typedef tuple<T...> inherited;
  12. public:
  13. tuple() {}
  14. tuple(typename std::add_lvalue_reference<typename std::add_const<H>::type>::type v,
  15. typename std::add_lvalue_reference<typename std::add_const<T>::type>::type... vtail)
  16. : inherited(vtail...), m_head(v) { }
  17. template<typename... VValues>
  18. tuple(const tuple<VValues...>& other)
  19. : inherited(other.tail()), m_head(other.head()) { }
  20. template<typename... VValues>
  21. tuple& operator=(const tuple<VValues...>& other)
  22. {
  23. m_head = other.head();
  24. tail() = other.tail();
  25. return *this;
  26. }
  27. typename std::add_lvalue_reference<H>::type head() { return m_head; }
  28. typename std::add_lvalue_reference<const H>::type head() const { return m_head; }
  29.  
  30. inherited& tail() { return *this; }
  31. const inherited& tail() const { return *this; }
  32. protected:
  33. H m_head;
  34. };
  35.  
  36. template<class... T>
  37. tuple<T...> make_tuple(T&&... t)
  38. {
  39. return tuple<T...>(t...);
  40. }
  41.  
  42. int main()
  43. {
  44. tuple<std::string, std::vector<int>, double> tt("hello", {1,2,3,4}, 1.2);
  45. std::string h = tt.head();
  46. tuple<std::vector<int>, double> t2 = tt.tail();
  47.  
  48. std::string s = "Hello";
  49. std::vector<int> v = {1,22,3,4,5};
  50. auto x = make_tuple(s, v, 1.2);
  51.  
  52. std::cout << "tt.head is " << tt.head() << '\n'
  53. << "t2.tail.head is " << t2.tail().head() << '\n'
  54. << " x.head is " << x.head() << '\n';
  55. }
  56.  
Success #stdin #stdout 0s 2964KB
stdin
Standard input is empty
stdout
tt.head is hello
t2.tail.head is 1.2
 x.head is Hello