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 T2, typename T3
  27. , typename T4, typename T5, typename T6 >
  28. std::ostream& operator<<(std::ostream& os, std::tr1::tuple<T1, T2, T3, T4, T5, T6> const& tuple)
  29. {
  30. os << '(';
  31. print_tuple(os, tuple, int_<std::tr1::tuple_size<std::tr1::tuple<T1, T2, T3, T4, T5, T6> >::value-1>());
  32. return os << ')';
  33. }
  34.  
  35. 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);}
  36. 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);}
  37. 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);}
  38. 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);}
  39. 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);}
  40. 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);}
  41.  
  42. struct nil {};
  43.  
  44. template<typename T>
  45. std::tr1::tuple<const T*> operator<<(const nil&, const T& obj)
  46. {
  47. return std::tr1::tuple<const T*>(&obj);
  48. }
  49.  
  50. int main()
  51. {
  52. nil lhs;
  53.  
  54. int i = 42;
  55. std::cout << (lhs << i);
  56. print_tuple(std::cout, lhs << 42);
  57. print_tuple(std::cout, lhs << 42 << 42);
  58. print_tuple(std::cout, lhs << 42 << 47.11);
  59. print_tuple(std::cout, lhs << i << 47.11 << "blah");
  60.  
  61. return 0;
  62. }
  63.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:55: error: no match for ‘operator<<’ in ‘std::cout << operator<<(const nil&, const T&) [with T = int](((const int&)((const int*)(& i))))’
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:112: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:121: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:131: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:169: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:177: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:97: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:184: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:111: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:195: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:204: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:208: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:213: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:217: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:225: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:229: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:125: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
stdout
Standard output is empty