#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... T >
std::ostream& operator<<(std::ostream& os, std::tuple<T...> const& tuple)
{
os << '(';
print_tuple(os, tuple, int_<std::tuple_size<std::tuple<T...> >::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+Cgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdD4gc3RydWN0IGludF97fTsKCnRlbXBsYXRlPGNsYXNzIFR1cGxlLCBzdGQ6OnNpemVfdCBJPgp2b2lkIHByaW50X3R1cGxlKHN0ZDo6b3N0cmVhbSYgb3MsIFR1cGxlIGNvbnN0JiB0dXBsZSwgaW50XzxJPil7CiAgcHJpbnRfdHVwbGUob3MsIHR1cGxlLCBpbnRfPEktMT4oKSk7CiAgb3MgPDwgIiwgIiA8PCAqc3RkOjpnZXQ8ST4odHVwbGUpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUdXBsZT4Kdm9pZCBwcmludF90dXBsZShzdGQ6Om9zdHJlYW0mIG9zLCBUdXBsZSBjb25zdCYgdHVwbGUsIGludF88MD4pewogIG9zIDw8ICpzdGQ6OmdldDwwPih0dXBsZSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uIFQgPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgc3RkOjp0dXBsZTxULi4uPiBjb25zdCYgdHVwbGUpCnsKICBvcyA8PCAnKCc7CiAgcHJpbnRfdHVwbGUob3MsIHR1cGxlLCBpbnRfPHN0ZDo6dHVwbGVfc2l6ZTxzdGQ6OnR1cGxlPFQuLi4+ID46OnZhbHVlLTE+KCkpOwogIHJldHVybiBvcyA8PCAnKSc7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHVwbGU8VDEgICAgICAgICAgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0dXBsZTxUMSAgICAgICAgICAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0dXBsZTxUMSAgICAgICAgICAgICAgICxjb25zdCBUKj4oc3RkOjpnZXQ8MD4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnR1cGxlPFQxLFQyICAgICAgICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHVwbGU8VDEsVDIgICAgICAgICAgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHVwbGU8VDEsVDIgICAgICAgICAgICAsY29uc3QgVCo+KHN0ZDo6Z2V0PDA+KHR1cGxlKSwgc3RkOjpnZXQ8MT4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0dXBsZTxUMSxUMixUMyAgICAgICAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnR1cGxlPFQxLFQyLFQzICAgICAgICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnR1cGxlPFQxLFQyLFQzICAgICAgICAgLGNvbnN0IFQqPihzdGQ6OmdldDwwPih0dXBsZSksIHN0ZDo6Z2V0PDE+KHR1cGxlKSwgc3RkOjpnZXQ8Mj4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0dXBsZTxUMSxUMixUMyxUNCAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0dXBsZTxUMSxUMixUMyxUNCAgICAgICxjb25zdCBUKj4oc3RkOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OmdldDwxPih0dXBsZSksIHN0ZDo6Z2V0PDI+KHR1cGxlKSwgc3RkOjpnZXQ8Mz4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1ICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQsVDUgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHVwbGU8VDEsVDIsVDMsVDQsVDUgICAsY29uc3QgVCo+KHN0ZDo6Z2V0PDA+KHR1cGxlKSwgc3RkOjpnZXQ8MT4odHVwbGUpLCBzdGQ6OmdldDwyPih0dXBsZSksIHN0ZDo6Z2V0PDM+KHR1cGxlKSwgc3RkOjpnZXQ8ND4odHVwbGUpICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVD4gc3RkOjp0dXBsZTxUMSxUMixUMyxUNCxUNSxUNixjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1LFQ2PiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1LFQ2LGNvbnN0IFQqPihzdGQ6OmdldDwwPih0dXBsZSksIHN0ZDo6Z2V0PDE+KHR1cGxlKSwgc3RkOjpnZXQ8Mj4odHVwbGUpLCBzdGQ6OmdldDwzPih0dXBsZSksIHN0ZDo6Z2V0PDQ+KHR1cGxlKSwgc3RkOjpnZXQ8NT4odHVwbGUpLCAmb2JqKTt9CgpzdHJ1Y3QgbmlsIHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RkOjp0dXBsZTxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBuaWwmLCBjb25zdCBUJiBvYmopCnsKICAgIHJldHVybiBzdGQ6OnR1cGxlPGNvbnN0IFQqPigmb2JqKTsKfQoKaW50IG1haW4oKQp7CgluaWwgbGhzOwoKICAgIGludCBpID0gNDI7CglzdGQ6OmNvdXQgPDwgKGxocyA8PCBpKTsKCWxocyA8PCA0MjsKCWxocyA8PCA0MiA8PCA0MjsKCWxocyA8PCA0MiA8PCA0Ny4xMTsKCWxocyA8PCBpIDw8IDQ3LjExIDw8ICJibGFoIjsKCglzdGQ6OmNvdXQgPDwgIlNVQ0NFU1M6IFN1Y2Nlc3NmdWxseSB0ZXN0ZWQhXG4iOwoJcmV0dXJuIDA7Cn0K