#include <iostream>
#include <string>
#include <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::get<I>(tuple);
}
template<class Tuple>
void print_tuple(std::ostream& os, Tuple const& tuple, int_<0>){
os << *std::get<0>(tuple);
}
template< typename T1, typename T2, typename T3
, typename T4, typename T5, typename T6 >
std::ostream& operator<<(std::ostream& os, std::tuple<T1, T2, T3, T4, T5, T6> const& tuple)
{
os << '(';
print_tuple(os, tuple, int_<std::tuple_size<std::tuple<T1, T2, T3, T4, T5, T6> >::value-1>());
return os << ')';
}
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);}
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);}
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);}
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);}
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);}
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);}
struct nil {};
template<typename T>
std::tuple<const T*> operator<<(const nil&, const T& obj)
{
return std::tuple<const T*>(&obj);
}
int main()
{
nil lhs;
int i = 42;
std::cout << (lhs << i);
lhs << 42;
lhs << 42 << 42;
lhs << 42 << 47.11;
lhs << i << 47.11 << "blah";
std::cout << "SUCCESS: Successfully tested!\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+Cgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdD4gc3RydWN0IGludF97fTsKCnRlbXBsYXRlPGNsYXNzIFR1cGxlLCBzdGQ6OnNpemVfdCBJPgp2b2lkIHByaW50X3R1cGxlKHN0ZDo6b3N0cmVhbSYgb3MsIFR1cGxlIGNvbnN0JiB0dXBsZSwgaW50XzxJPil7CiAgcHJpbnRfdHVwbGUob3MsIHR1cGxlLCBpbnRfPEktMT4oKSk7CiAgb3MgPDwgIiwgIiA8PCAqc3RkOjpnZXQ8ST4odHVwbGUpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUdXBsZT4Kdm9pZCBwcmludF90dXBsZShzdGQ6Om9zdHJlYW0mIG9zLCBUdXBsZSBjb25zdCYgdHVwbGUsIGludF88MD4pewogIG9zIDw8ICpzdGQ6OmdldDwwPih0dXBsZSk7Cn0KCnRlbXBsYXRlPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzCiAgICAgICAgLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2ID4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gY29uc3QmIHR1cGxlKQp7CiAgb3MgPDwgJygnOwogIHByaW50X3R1cGxlKG9zLCB0dXBsZSwgaW50XzxzdGQ6OnR1cGxlX3NpemU8c3RkOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+Ojp2YWx1ZS0xPigpKTsKICByZXR1cm4gb3MgPDwgJyknOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnR1cGxlPFQxICAgICAgICAgICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHVwbGU8VDEgICAgICAgICAgICAgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHVwbGU8VDEgICAgICAgICAgICAgICAsY29uc3QgVCo+KHN0ZDo6Z2V0PDA+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0dXBsZTxUMSxUMiAgICAgICAgICAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnR1cGxlPFQxLFQyICAgICAgICAgICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnR1cGxlPFQxLFQyICAgICAgICAgICAgLGNvbnN0IFQqPihzdGQ6OmdldDwwPih0dXBsZSksIHN0ZDo6Z2V0PDE+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHVwbGU8VDEsVDIsVDMgICAgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0dXBsZTxUMSxUMixUMyAgICAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0dXBsZTxUMSxUMixUMyAgICAgICAgICxjb25zdCBUKj4oc3RkOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OmdldDwxPih0dXBsZSksIHN0ZDo6Z2V0PDI+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0ICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQgICAgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQgICAgICAsY29uc3QgVCo+KHN0ZDo6Z2V0PDA+KHR1cGxlKSwgc3RkOjpnZXQ8MT4odHVwbGUpLCBzdGQ6OmdldDwyPih0dXBsZSksIHN0ZDo6Z2V0PDM+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1ICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0dXBsZTxUMSxUMixUMyxUNCxUNSAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1ICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1ICAgLGNvbnN0IFQqPihzdGQ6OmdldDwwPih0dXBsZSksIHN0ZDo6Z2V0PDE+KHR1cGxlKSwgc3RkOjpnZXQ8Mj4odHVwbGUpLCBzdGQ6OmdldDwzPih0dXBsZSksIHN0ZDo6Z2V0PDQ+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ+IHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQsVDUsVDYsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0dXBsZTxUMSxUMixUMyxUNCxUNSxUNj4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0dXBsZTxUMSxUMixUMyxUNCxUNSxUNixjb25zdCBUKj4oc3RkOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OmdldDwxPih0dXBsZSksIHN0ZDo6Z2V0PDI+KHR1cGxlKSwgc3RkOjpnZXQ8Mz4odHVwbGUpLCBzdGQ6OmdldDw0Pih0dXBsZSksIHN0ZDo6Z2V0PDU+KHR1cGxlKSwgJm9iaik7fQoKc3RydWN0IG5pbCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0ZDo6dHVwbGU8Y29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3QgbmlsJiwgY29uc3QgVCYgb2JqKQp7CiAgICByZXR1cm4gc3RkOjp0dXBsZTxjb25zdCBUKj4oJm9iaik7Cn0KCmludCBtYWluKCkKewoJbmlsIGxoczsKCiAgICBpbnQgaSA9IDQyOwoJc3RkOjpjb3V0IDw8IChsaHMgPDwgaSk7CglsaHMgPDwgNDI7CglsaHMgPDwgNDIgPDwgNDI7CglsaHMgPDwgNDIgPDwgNDcuMTE7CglsaHMgPDwgaSA8PCA0Ny4xMSA8PCAiYmxhaCI7CgoJc3RkOjpjb3V0IDw8ICJTVUNDRVNTOiBTdWNjZXNzZnVsbHkgdGVzdGVkIVxuIjsKCXJldHVybiAwOwp9Cg==