#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 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;
print_tuple(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+KCkpOwogIG9zIDw8ICIpXG4iOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnRyMTo6dHVwbGU8VDEgICAgICAgICAgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0cjE6OnR1cGxlPFQxICAgICAgICAgICAgICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnRyMTo6dHVwbGU8VDEgICAgICAgICAgICAgICAsY29uc3QgVCo+KHN0ZDo6dHIxOjpnZXQ8MD4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyICAgICAgICAgICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMiAgICAgICAgICAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyICAgICAgICAgICAgLGNvbnN0IFQqPihzdGQ6OnRyMTo6Z2V0PDA+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwxPih0dXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHR5cGVuYW1lIFQ+IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyAgICAgICAgICxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMgICAgICAgICA+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyAgICAgICAgICxjb25zdCBUKj4oc3RkOjp0cjE6OmdldDwwPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8MT4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDI+KHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iaik7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0eXBlbmFtZSBUPiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQgICAgICAsY29uc3QgVCo+IG9wZXJhdG9yPDwoY29uc3Qgc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0ICAgICAgPiYgdHVwbGUsIGNvbnN0IFQmIG9iaikge3JldHVybiBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQgICAgICAsY29uc3QgVCo+KHN0ZDo6dHIxOjpnZXQ8MD4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDE+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwyPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8Mz4odHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICZvYmopO30KdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1ICAgICAgICAgICAgICwgdHlwZW5hbWUgVD4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1ICAgLGNvbnN0IFQqPiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCxUNSAgID4mIHR1cGxlLCBjb25zdCBUJiBvYmopIHtyZXR1cm4gc3RkOjp0cjE6OnR1cGxlPFQxLFQyLFQzLFQ0LFQ1ICAgLGNvbnN0IFQqPihzdGQ6OnRyMTo6Z2V0PDA+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwxPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8Mj4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDM+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDw0Pih0dXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2JqKTt9CnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ+IHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCxUNSxUNixjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBzdGQ6OnRyMTo6dHVwbGU8VDEsVDIsVDMsVDQsVDUsVDY+JiB0dXBsZSwgY29uc3QgVCYgb2JqKSB7cmV0dXJuIHN0ZDo6dHIxOjp0dXBsZTxUMSxUMixUMyxUNCxUNSxUNixjb25zdCBUKj4oc3RkOjp0cjE6OmdldDwwPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8MT4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDI+KHR1cGxlKSwgc3RkOjp0cjE6OmdldDwzPih0dXBsZSksIHN0ZDo6dHIxOjpnZXQ8ND4odHVwbGUpLCBzdGQ6OnRyMTo6Z2V0PDU+KHR1cGxlKSwgJm9iaik7fQoKc3RydWN0IG5pbCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0ZDo6dHIxOjp0dXBsZTxjb25zdCBUKj4gb3BlcmF0b3I8PChjb25zdCBuaWwmLCBjb25zdCBUJiBvYmopCnsKICAgIHJldHVybiBzdGQ6OnRyMTo6dHVwbGU8Y29uc3QgVCo+KCZvYmopOwp9CgppbnQgbWFpbigpCnsKCW5pbCBsaHM7CgogICAgaW50IGkgPSA0MjsKCXByaW50X3R1cGxlKHN0ZDo6Y291dCwgbGhzIDw8IGkpOwoJcHJpbnRfdHVwbGUoc3RkOjpjb3V0LCBsaHMgPDwgNDIpOwoJcHJpbnRfdHVwbGUoc3RkOjpjb3V0LCBsaHMgPDwgNDIgPDwgNDIpOwoJcHJpbnRfdHVwbGUoc3RkOjpjb3V0LCBsaHMgPDwgNDIgPDwgNDcuMTEpOwoJcHJpbnRfdHVwbGUoc3RkOjpjb3V0LCBsaHMgPDwgaSA8PCA0Ny4xMSA8PCAiYmxhaCIpOwoKCXJldHVybiAwOwp9Cg==