fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <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::get<I>(tuple);
  11. }
  12.  
  13. template<class Tuple>
  14. void print_tuple(std::ostream& os, Tuple const& tuple, int_<0>){
  15. os << *std::get<0>(tuple);
  16. }
  17.  
  18. template< typename T1, typename T2, typename T3
  19. , typename T4, typename T5, typename T6 >
  20. std::ostream& operator<<(std::ostream& os, std::tuple<T1, T2, T3, T4, T5, T6> const& tuple)
  21. {
  22. os << '(';
  23. print_tuple(os, tuple, int_<std::tuple_size<std::tuple<T1, T2, T3, T4, T5, T6> >::value-1>());
  24. return os << ')';
  25. }
  26.  
  27. template<typename T1 , typename T> std::tuple<T1 ,const T*> operator<<(const std::tuple<T1 >& tuple, const T& obj) {return std::tuple<T1 ,const T*>(std::get<0>(tuple) , &obj);}
  28. template<typename T1, typename T2 , typename T> std::tuple<T1,T2 ,const T*> operator<<(const std::tuple<T1,T2 >& tuple, const T& obj) {return std::tuple<T1,T2 ,const T*>(std::get<0>(tuple), std::get<1>(tuple) , &obj);}
  29. template<typename T1, typename T2, typename T3 , typename T> std::tuple<T1,T2,T3 ,const T*> operator<<(const std::tuple<T1,T2,T3 >& tuple, const T& obj) {return std::tuple<T1,T2,T3 ,const T*>(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple) , &obj);}
  30. template<typename T1, typename T2, typename T3, typename T4 , typename T> std::tuple<T1,T2,T3,T4 ,const T*> operator<<(const std::tuple<T1,T2,T3,T4 >& tuple, const T& obj) {return std::tuple<T1,T2,T3,T4 ,const T*>(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple) , &obj);}
  31. template<typename T1, typename T2, typename T3, typename T4, typename T5 , typename T> std::tuple<T1,T2,T3,T4,T5 ,const T*> operator<<(const std::tuple<T1,T2,T3,T4,T5 >& tuple, const T& obj) {return std::tuple<T1,T2,T3,T4,T5 ,const T*>(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple) , &obj);}
  32. template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T> std::tuple<T1,T2,T3,T4,T5,T6,const T*> operator<<(const std::tuple<T1,T2,T3,T4,T5,T6>& tuple, const T& obj) {return std::tuple<T1,T2,T3,T4,T5,T6,const T*>(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), &obj);}
  33.  
  34. struct nil {};
  35.  
  36. template<typename T>
  37. std::tuple<const T*> operator<<(const nil&, const T& obj)
  38. {
  39. return std::tuple<const T*>(&obj);
  40. }
  41.  
  42. int main()
  43. {
  44. nil lhs;
  45.  
  46. int i = 42;
  47. std::cout << (lhs << i);
  48. lhs << 42;
  49. lhs << 42 << 42;
  50. lhs << 42 << 47.11;
  51. lhs << i << 47.11 << "blah";
  52.  
  53. std::cout << "SUCCESS: Successfully tested!\n";
  54. return 0;
  55. }
  56.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function 'int main()':
prog.cpp:47:24: error: cannot bind 'std::ostream' lvalue to 'std::basic_ostream<char>&&'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/ostream:579:5: error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::tuple<const int*>]'
stdout
Standard output is empty