#include <iostream>
#include <string>
#include <functional>
using namespace std;
void x(ostream &os) {
os << "x()" << std::endl;
}
template <class T>
void y(void (*f)(ostream &), T &os) {
std::cout << "y(): ";
(*f)(os);
}
template <class T>
void z(void (*f)(ostream &), T os) {
std::cout << "z(): ";
(*f)(os);
}
int main() {
x(cout);
y(x, cout);
//z(x, cout); /* No Good !! because "basic_ostream(const basic_ostream&) = delete;" */
z(x, ref(cout)); /* OK. */
return 0;
}
/* end */
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIHgob3N0cmVhbSAmb3MpIHsKICBvcyA8PCAieCgpIiA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIHkodm9pZCAoKmYpKG9zdHJlYW0gJiksIFQgJm9zKSB7CiAgc3RkOjpjb3V0IDw8ICJ5KCk6ICI7CiAgKCpmKShvcyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIHoodm9pZCAoKmYpKG9zdHJlYW0gJiksIFQgb3MpIHsKICBzdGQ6OmNvdXQgPDwgInooKTogIjsKICAoKmYpKG9zKTsKfQoKaW50IG1haW4oKSB7CiAgeChjb3V0KTsKICB5KHgsIGNvdXQpOwogIC8veih4LCBjb3V0KTsgLyogTm8gR29vZCAhISBiZWNhdXNlICJiYXNpY19vc3RyZWFtKGNvbnN0IGJhc2ljX29zdHJlYW0mKSA9IGRlbGV0ZTsiICovCiAgeih4LCByZWYoY291dCkpOyAvKiBPSy4gKi8KIHJldHVybiAwOwp9Ci8qIGVuZCAqLwo=