#include <stdio.h>
class duck{
public:
template <typename Quacker>
void quack(const Quacker & q){
quack_the_duck(*this, q);
}
void quack_happily(){
printf("quack :)");
}
void quack_sadly(){
printf("quack :(");
}
void quack_confusedly(){
printf("quack ??");
}
};
template <typename Quacker>
void quack_the_duck(duck & d, const Quacker & q){
d.quack_confusedly();
}
class a_quacker{
public:
};
void quack_the_duck(duck & d, const a_quacker & q){
d.quack_happily();
}
int main(){
duck d;
a_quacker cracker;
d.quack(cracker);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBkdWNrewpwdWJsaWM6Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhY2tlcj4KCXZvaWQgcXVhY2soY29uc3QgUXVhY2tlciAmIHEpewoJCXF1YWNrX3RoZV9kdWNrKCp0aGlzLCBxKTsKCX0KCXZvaWQgcXVhY2tfaGFwcGlseSgpewoJCXByaW50ZigicXVhY2sgOikiKTsKCX0KCXZvaWQgcXVhY2tfc2FkbHkoKXsKCQlwcmludGYoInF1YWNrIDooIik7Cgl9Cgl2b2lkIHF1YWNrX2NvbmZ1c2VkbHkoKXsKCQlwcmludGYoInF1YWNrID8/Iik7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhY2tlcj4Kdm9pZCBxdWFja190aGVfZHVjayhkdWNrICYgZCwgY29uc3QgUXVhY2tlciAmIHEpewoJZC5xdWFja19jb25mdXNlZGx5KCk7Cn0KCmNsYXNzIGFfcXVhY2tlcnsKcHVibGljOgp9OwoKdm9pZCBxdWFja190aGVfZHVjayhkdWNrICYgZCwgY29uc3QgYV9xdWFja2VyICYgcSl7CglkLnF1YWNrX2hhcHBpbHkoKTsKfQoKaW50IG1haW4oKXsKCWR1Y2sgZDsKCWFfcXVhY2tlciBjcmFja2VyOwoJZC5xdWFjayhjcmFja2VyKTsKCXJldHVybiAwOwp9Cg==