#include <iostream>
#include <string>
#include <tr1/tuple>
template<std::size_t> struct int_{};
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<class Tuple>
void print_tuple(std::ostream& os, Tuple const& tuple)
{
os << '(';
print_tuple(os, tuple, int_<std::tr1::tuple_size<Tuple>::value-1>());
os << ")\n";
}
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-1>());
return os << ')';
}
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);}
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);}
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);}
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);}
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);}
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);}
struct nil {};
template<typename T>
std::tr1::tuple<const T*> operator<<(const nil&, const T& obj)
{
return std::tr1::tuple<const T*>(&obj);
}
int main()
{
nil lhs;
int i = 42;
std::cout << (lhs << i);
print_tuple(std::cout, lhs << 42);
print_tuple(std::cout, lhs << 42 << 42);
print_tuple(std::cout, lhs << 42 << 47.11);
print_tuple(std::cout, lhs << i << 47.11 << "blah");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHIxL3R1cGxlPgoKdGVtcGxhdGU8c3RkOjpzaXplX3Q+IHN0cnVjdCBpbnRfe307Cgp0ZW1wbGF0ZTxjbGFzcyBUdXBsZSwgc3RkOjpzaXplX3QgST4Kdm9pZCBwcmludF90dXBsZShzdGQ6Om9zdHJlYW0mIG9zLCBUdXBsZSBjb25zdCYgdHVwbGUsIGludF88ST4pewogIHByaW50X3R1cGxlKG9zLCB0dXBsZSwgaW50XzxJLTE+KCkpOwogIG9zIDw8ICIsICIgPDwgKnN0ZDo6dHIxOjpnZXQ8ST4odHVwbGUpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUdXBsZT4Kdm9pZCBwcmludF90dXBsZShzdGQ6Om9zdHJlYW0mIG9zLCBUdXBsZSBjb25zdCYgdHVwbGUsIGludF88MD4pewogIG9zIDw8ICpzdGQ6OnRyMTo6Z2V0PDA+KHR1cGxlKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVHVwbGU+CnZvaWQgcHJpbnRfdHVwbGUoc3RkOjpvc3RyZWFtJiBvcywgVHVwbGUgY29uc3QmIHR1cGxlKQp7CiAgb3MgPDwgJygnOwogIHByaW50X3R1cGxlKG9zLCB0dXBsZSwgaW50XzxzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlLTE+KCkpOwogIG9zIDw8ICIpXG4iOwp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMwogICAgICAgICwgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNiA+CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gY29uc3QmIHR1cGxlKQp7CiAgb3MgPDwgJygnOwogIHByaW50X3R1cGxlKG9zLCB0dXBsZSwgaW50XzxzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPjo6dmFsdWUtMT4oKSk7CiAgcmV0dXJuIG9zIDw8ICcpJzsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0cjE6OnR1cGxlPFQxICAgICAgICAgICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHIxOjp0dXBsZTxUMSAgICAgICAgICAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0cjE6OnR1cGxlPFQxICAgICAgICAgICAgICAgLGNvbnN0IFQqPihzdGQ6OnRyMTo6Z2V0PDA+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMiAgICAgICAgICAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIgICAgICAgICAgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHIxOjp0dXBsZTxUMSxUMiAgICAgICAgICAgICxjb25zdCBUKj4oc3RkOjp0cjE6OmdldDwwPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8MT4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMgICAgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzICAgICAgICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMgICAgICAgICAsY29uc3QgVCo+KHN0ZDo6dHIxOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDE+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwyPih0dXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQgICAgICAgICAgICAgICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0ICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0ICAgICAgLGNvbnN0IFQqPihzdGQ6OnRyMTo6Z2V0PDA+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwxPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8Mj4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDM+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCxUNSAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQsVDUgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCxUNSAgICxjb25zdCBUKj4oc3RkOjp0cjE6OmdldDwwPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8MT4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDI+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwzPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8ND4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUPiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQsVDUsVDYsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1LFQ2PiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQsVDUsVDYsY29uc3QgVCo+KHN0ZDo6dHIxOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDE+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwyPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8Mz4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDQ+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDw1Pih0dXBsZSksICZvYmopO30KCnN0cnVjdCBuaWwge307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6OnRyMTo6dHVwbGU8Y29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3QgbmlsJiwgY29uc3QgVCYgb2JqKQp7CiAgICByZXR1cm4gc3RkOjp0cjE6OnR1cGxlPGNvbnN0IFQqPigmb2JqKTsKfQoKaW50IG1haW4oKQp7CgluaWwgbGhzOwoKICAgIGludCBpID0gNDI7CglzdGQ6OmNvdXQgPDwgKGxocyA8PCBpKTsKCXByaW50X3R1cGxlKHN0ZDo6Y291dCwgbGhzIDw8IDQyKTsKCXByaW50X3R1cGxlKHN0ZDo6Y291dCwgbGhzIDw8IDQyIDw8IDQyKTsKCXByaW50X3R1cGxlKHN0ZDo6Y291dCwgbGhzIDw8IDQyIDw8IDQ3LjExKTsKCXByaW50X3R1cGxlKHN0ZDo6Y291dCwgbGhzIDw8IGkgPDwgNDcuMTEgPDwgImJsYWgiKTsKCglyZXR1cm4gMDsKfQo=
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>]