#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";
}