#include <iostream>
struct my_cout_t {
template <typename T>
my_cout_t& write(T const& t) {
do_write(std::cout, t);
return *this;
}
};
struct foo {};
struct bar {};
void do_write(std::ostream& os, foo const&) {
os << "yay!\n";
}
void do_write(std::ostream& os, bar const&) {
os << "works!\n";
}
my_cout_t cout;
int main() {
cout.write(foo())
.write(bar());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnN0cnVjdCBteV9jb3V0X3QgewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBteV9jb3V0X3QmIHdyaXRlKFQgY29uc3QmIHQpIHsKICAgICAgICBkb193cml0ZShzdGQ6OmNvdXQsIHQpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKIApzdHJ1Y3QgZm9vIHt9OwpzdHJ1Y3QgYmFyIHt9OwogCnZvaWQgZG9fd3JpdGUoc3RkOjpvc3RyZWFtJiBvcywgZm9vIGNvbnN0JikgewogICAgb3MgPDwgInlheSFcbiI7Cn0Kdm9pZCBkb193cml0ZShzdGQ6Om9zdHJlYW0mIG9zLCBiYXIgY29uc3QmKSB7CiAgICBvcyA8PCAid29ya3MhXG4iOwp9CiAKbXlfY291dF90IGNvdXQ7CiAKaW50IG1haW4oKSB7CiAgICBjb3V0LndyaXRlKGZvbygpKQogICAgICAgIC53cml0ZShiYXIoKSk7Cn0=