//http://stackoverflow.com/questions/24923211/how-to-output-values-to-a-tuple-of-streams-in-c11
#include <iostream>
#include <tuple>
#include <utility>
#include <fstream>
template <unsigned int N>
struct tee_stream
{
template <typename ...Args, typename T>
static std::tuple<Args...> & print(std::tuple<Args...> & t, T && x)
{
std::get<sizeof...(Args) - N>(t) << x;
tee_stream<N - 1>::print(t, std::forward<T>(x));
return t;
}
};
template <>
struct tee_stream<0>
{
template <typename ...Args, typename T>
static std::tuple<Args...> & print(std::tuple<Args...> &, T &&) {}
};
template <typename ...Args, typename T>
std::tuple<Args...> & operator<<(std::tuple<Args...> & t, T && x)
{
return tee_stream<sizeof...(Args)>::print(t, std::forward<T>(x));
}
template <typename ...Args, typename T>
std::tuple<Args...> & operator<<(std::tuple<Args...> && t, T && x)
{
return tee_stream<sizeof...(Args)>::print(t, std::forward<T>(x));
}
int main()
{
std::ofstream os("a.txt");
auto t = std::tie(std::cout, os);
t << "Foo" << "Bar\n";
std::tie(std::cout, os) << "Foo" << "Bar\n";
}
Ly9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0OTIzMjExL2hvdy10by1vdXRwdXQtdmFsdWVzLXRvLWEtdHVwbGUtb2Ytc3RyZWFtcy1pbi1jMTEKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8ZnN0cmVhbT4KCiAgICAgCnRlbXBsYXRlIDx1bnNpZ25lZCBpbnQgTj4Kc3RydWN0IHRlZV9zdHJlYW0KewogIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBUPgogIHN0YXRpYyBzdGQ6OnR1cGxlPEFyZ3MuLi4+ICYgcHJpbnQoc3RkOjp0dXBsZTxBcmdzLi4uPiAmIHQsIFQgJiYgeCkKICB7CiAgICBzdGQ6OmdldDxzaXplb2YuLi4oQXJncykgLSBOPih0KSA8PCB4OwogICAgdGVlX3N0cmVhbTxOIC0gMT46OnByaW50KHQsIHN0ZDo6Zm9yd2FyZDxUPih4KSk7CiAgICByZXR1cm4gdDsKICB9Cn07CiAgICAgCnRlbXBsYXRlIDw+CnN0cnVjdCB0ZWVfc3RyZWFtPDA+CnsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVD4KICBzdGF0aWMgc3RkOjp0dXBsZTxBcmdzLi4uPiAmIHByaW50KHN0ZDo6dHVwbGU8QXJncy4uLj4gJiwgVCAmJikge30KfTsKICAgICAKdGVtcGxhdGUgPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFQ+CnN0ZDo6dHVwbGU8QXJncy4uLj4gJiBvcGVyYXRvcjw8KHN0ZDo6dHVwbGU8QXJncy4uLj4gJiB0LCBUICYmIHgpCnsKICByZXR1cm4gdGVlX3N0cmVhbTxzaXplb2YuLi4oQXJncyk+OjpwcmludCh0LCBzdGQ6OmZvcndhcmQ8VD4oeCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVD4Kc3RkOjp0dXBsZTxBcmdzLi4uPiAmIG9wZXJhdG9yPDwoc3RkOjp0dXBsZTxBcmdzLi4uPiAmJiB0LCBUICYmIHgpCnsKICByZXR1cm4gdGVlX3N0cmVhbTxzaXplb2YuLi4oQXJncyk+OjpwcmludCh0LCBzdGQ6OmZvcndhcmQ8VD4oeCkpOwp9CiAgICAgCmludCBtYWluKCkKewogIHN0ZDo6b2ZzdHJlYW0gb3MoImEudHh0Iik7CiAgYXV0byB0ID0gc3RkOjp0aWUoc3RkOjpjb3V0LCBvcyk7CiAgdCA8PCAiRm9vIiA8PCAiQmFyXG4iOwogIHN0ZDo6dGllKHN0ZDo6Y291dCwgb3MpIDw8ICJGb28iIDw8ICJCYXJcbiI7Cn0K