fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <tr1/tuple>
  4.  
  5. template<std::size_t> struct int_{};
  6.  
  7. template<class Tuple, std::size_t I>
  8. void print_tuple(std::ostream& os, Tuple const& tuple, int_<I>){
  9. print_tuple(os, tuple, int_<I-1>());
  10. os << ", " << *std::tr1::get<I>(tuple);
  11. }
  12.  
  13. template<class Tuple>
  14. void print_tuple(std::ostream& os, Tuple const& tuple, int_<0>){
  15. os << *std::tr1::get<0>(tuple);
  16. }
  17.  
  18. template<class Tuple>
  19. void print_tuple(std::ostream& os, Tuple const& tuple)
  20. {
  21. os << '(';
  22. print_tuple(os, tuple, int_<std::tr1::tuple_size<Tuple>::value-1>());
  23. os << ")\n";
  24. }
  25.  
  26. template<typename T1 , typename T> std::tr1::tuple<T1 ,const T*> operator<<(const std::tr1::tuple<T1 >& tuple, const T& obj) {return std::tr1::tuple<T1 ,const T*>(std::tr1::get<0>(tuple) , &obj);}
  27. template<typename T1, typename T2 , typename T> std::tr1::tuple<T1,T2 ,const T*> operator<<(const std::tr1::tuple<T1,T2 >& tuple, const T& obj) {return std::tr1::tuple<T1,T2 ,const T*>(std::tr1::get<0>(tuple), std::tr1::get<1>(tuple) , &obj);}
  28. template<typename T1, typename T2, typename T3 , typename T> std::tr1::tuple<T1,T2,T3 ,const T*> operator<<(const std::tr1::tuple<T1,T2,T3 >& tuple, const T& obj) {return std::tr1::tuple<T1,T2,T3 ,const T*>(std::tr1::get<0>(tuple), std::tr1::get<1>(tuple), std::tr1::get<2>(tuple) , &obj);}
  29. template<typename T1, typename T2, typename T3, typename T4 , typename T> std::tr1::tuple<T1,T2,T3,T4 ,const T*> operator<<(const std::tr1::tuple<T1,T2,T3,T4 >& tuple, const T& obj) {return std::tr1::tuple<T1,T2,T3,T4 ,const T*>(std::tr1::get<0>(tuple), std::tr1::get<1>(tuple), std::tr1::get<2>(tuple), std::tr1::get<3>(tuple) , &obj);}
  30. template<typename T1, typename T2, typename T3, typename T4, typename T5 , typename T> std::tr1::tuple<T1,T2,T3,T4,T5 ,const T*> operator<<(const std::tr1::tuple<T1,T2,T3,T4,T5 >& tuple, const T& obj) {return std::tr1::tuple<T1,T2,T3,T4,T5 ,const T*>(std::tr1::get<0>(tuple), std::tr1::get<1>(tuple), std::tr1::get<2>(tuple), std::tr1::get<3>(tuple), std::tr1::get<4>(tuple) , &obj);}
  31. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T> std::tr1::tuple<T1,T2,T3,T4,T5,T6,const T*> operator<<(const std::tr1::tuple<T1,T2,T3,T4,T5,T6>& tuple, const T& obj) {return std::tr1::tuple<T1,T2,T3,T4,T5,T6,const T*>(std::tr1::get<0>(tuple), std::tr1::get<1>(tuple), std::tr1::get<2>(tuple), std::tr1::get<3>(tuple), std::tr1::get<4>(tuple), std::tr1::get<5>(tuple), &obj);}
  32.  
  33. struct nil {};
  34.  
  35. template<typename T>
  36. std::tr1::tuple<const T*> operator<<(const nil&, const T& obj)
  37. {
  38. return std::tr1::tuple<const T*>(&obj);
  39. }
  40.  
  41. int main()
  42. {
  43. nil lhs;
  44.  
  45. int i = 42;
  46. print_tuple(std::cout, lhs << i);
  47. print_tuple(std::cout, lhs << 42);
  48. print_tuple(std::cout, lhs << 42 << 42);
  49. print_tuple(std::cout, lhs << 42 << 47.11);
  50. print_tuple(std::cout, lhs << i << 47.11 << "blah");
  51.  
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0.01s 2680KB
stdin
Standard input is empty
stdout
(42)
(42)
(42, 42)
(42, 47.11)
(42, 47.11, blah)