#include <iostream>
#include <string>
#include <tr1/tuple>
template<std::size_t> struct int_{}; // compile-time counter
template<class Tuple, std::size_t I>
void print_tuple(std::ostream& os, Tuple const& tuple, int_<I>){
print_tuple(os, tuple, int_<I-1>());
os << ", " << std::tr1::get<I>(tuple);
}
template<class Tuple>
void print_tuple(std::ostream& os, Tuple const& tuple, int_<0>){
os << std::tr1::get<0>(tuple);
}
template< typename T1, typename T2, typename T3
, typename T4, typename T5, typename T6 >
std::ostream& operator<<(std::ostream& os, std::tr1::tuple<T1, T2, T3, T4, T5, T6> const& tuple)
{
os << '(';
print_tuple(os, tuple, int_<std::tr1::tuple_size<std::tr1::tuple<T1, T2, T3, T4, T5, T6> >::value>());
return os << ')';
}
int main()
{
std::tr1::tuple<int, double, std::string> foo(42, 47.11, "blah");
std::cout << foo;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHIxL3R1cGxlPgoKdGVtcGxhdGU8c3RkOjpzaXplX3Q+IHN0cnVjdCBpbnRfe307IC8vIGNvbXBpbGUtdGltZSBjb3VudGVyCgp0ZW1wbGF0ZTxjbGFzcyBUdXBsZSwgc3RkOjpzaXplX3QgST4Kdm9pZCBwcmludF90dXBsZShzdGQ6Om9zdHJlYW0mIG9zLCBUdXBsZSBjb25zdCYgdHVwbGUsIGludF88ST4pewogIHByaW50X3R1cGxlKG9zLCB0dXBsZSwgaW50XzxJLTE+KCkpOwogIG9zIDw8ICIsICIgPDwgc3RkOjp0cjE6OmdldDxJPih0dXBsZSk7Cn0KCnRlbXBsYXRlPGNsYXNzIFR1cGxlPgp2b2lkIHByaW50X3R1cGxlKHN0ZDo6b3N0cmVhbSYgb3MsIFR1cGxlIGNvbnN0JiB0dXBsZSwgaW50XzwwPil7CiAgb3MgPDwgc3RkOjp0cjE6OmdldDwwPih0dXBsZSk7Cn0KCnRlbXBsYXRlPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzCiAgICAgICAgLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2ID4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBjb25zdCYgdHVwbGUpCnsKICBvcyA8PCAnKCc7CiAgcHJpbnRfdHVwbGUob3MsIHR1cGxlLCBpbnRfPHN0ZDo6dHIxOjp0dXBsZV9zaXplPHN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+Ojp2YWx1ZT4oKSk7CiAgcmV0dXJuIG9zIDw8ICcpJzsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnRyMTo6dHVwbGU8aW50LCBkb3VibGUsIHN0ZDo6c3RyaW5nPiBmb28oNDIsIDQ3LjExLCAiYmxhaCIpOwoKCXN0ZDo6Y291dCA8PCBmb287CgoJcmV0dXJuIDA7Cn0K
prog.cpp: In function ‘int main()’:
prog.cpp:31: error: no match for ‘operator<<’ in ‘std::cout << foo’
/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>]