#include <iostream>
#include <tuple>
#include <utility>
template <unsigned int N>
struct printer
{
template <typename ...Args, typename T>
static void print(std::tuple<Args...> & t, T && x)
{
std::get<sizeof...(Args) - N>(t) << x;
printer<N - 1>::print(t, std::forward<T>(x));
}
};
template <>
struct printer<0>
{
template <typename ...Args, typename T>
static void print(std::tuple<Args...> &, T &&) {}
};
template <typename ...Args, typename T>
void operator<<(std::tuple<Args...> && t, T && x)
{
printer<sizeof...(Args)>::print(t, std::forward<T>(x));
}
int main()
{
std::tie(std::cout, std::cout) << "Foo\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdGVtcGxhdGUgPHVuc2lnbmVkIGludCBOPgpzdHJ1Y3QgcHJpbnRlcgp7Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVD4KICAgIHN0YXRpYyB2b2lkIHByaW50KHN0ZDo6dHVwbGU8QXJncy4uLj4gJiB0LCBUICYmIHgpCiAgICB7CiAgICAJc3RkOjpnZXQ8c2l6ZW9mLi4uKEFyZ3MpIC0gTj4odCkgPDwgeDsKICAgIAlwcmludGVyPE4gLSAxPjo6cHJpbnQodCwgc3RkOjpmb3J3YXJkPFQ+KHgpKTsKICAgIH0KfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBwcmludGVyPDA+CnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBUPgogICAgc3RhdGljIHZvaWQgcHJpbnQoc3RkOjp0dXBsZTxBcmdzLi4uPiAmLCBUICYmKSB7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFQ+CnZvaWQgb3BlcmF0b3I8PChzdGQ6OnR1cGxlPEFyZ3MuLi4+ICYmIHQsIFQgJiYgeCkKewogICAgcHJpbnRlcjxzaXplb2YuLi4oQXJncyk+OjpwcmludCh0LCBzdGQ6OmZvcndhcmQ8VD4oeCkpOwp9CgppbnQgbWFpbigpCnsKCXN0ZDo6dGllKHN0ZDo6Y291dCwgc3RkOjpjb3V0KSA8PCAiRm9vXG4iOwp9