#include <iostream>
#include <iomanip>
using namespace std;
static void print_addr(const char *type, const void *p){
cout << right << setfill(' ');
cout << setw(32) << type << ": ";
cout << left << "I'm " << p << endl;
}
class with_ref{
public:
void whoami(void) const{
print_addr(__PRETTY_FUNCTION__, this);
}
void whoami(void){
print_addr(__PRETTY_FUNCTION__, this);
static_cast<const with_ref &>(*this).whoami();
}
};
class without_ref{
public:
void whoami(void) const{
print_addr(__PRETTY_FUNCTION__, this);
}
void whoami(void){
print_addr(__PRETTY_FUNCTION__, this);
static_cast<const without_ref>(*this).whoami();
}
};
int main() {
with_ref with_ref_inst;
with_ref_inst.whoami();
without_ref without_ref_inst;
without_ref_inst.whoami();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0YXRpYyB2b2lkIHByaW50X2FkZHIoY29uc3QgY2hhciAqdHlwZSwgY29uc3Qgdm9pZCAqcCl7Cgljb3V0IDw8IHJpZ2h0IDw8IHNldGZpbGwoJyAnKTsKCWNvdXQgPDwgc2V0dygzMikgPDwgdHlwZSA8PCAiOiAiOwoJY291dCA8PCBsZWZ0IDw8ICJJJ20gIiA8PCBwIDw8IGVuZGw7Cn0KCmNsYXNzIHdpdGhfcmVmewpwdWJsaWM6Cgl2b2lkIHdob2FtaSh2b2lkKSBjb25zdHsKCQlwcmludF9hZGRyKF9fUFJFVFRZX0ZVTkNUSU9OX18sIHRoaXMpOwoJfQoJdm9pZCB3aG9hbWkodm9pZCl7CgkJcHJpbnRfYWRkcihfX1BSRVRUWV9GVU5DVElPTl9fLCB0aGlzKTsKCQlzdGF0aWNfY2FzdDxjb25zdCB3aXRoX3JlZiAmPigqdGhpcykud2hvYW1pKCk7Cgl9Cn07CgpjbGFzcyB3aXRob3V0X3JlZnsKcHVibGljOgoJdm9pZCB3aG9hbWkodm9pZCkgY29uc3R7CgkJcHJpbnRfYWRkcihfX1BSRVRUWV9GVU5DVElPTl9fLCB0aGlzKTsKCX0KCXZvaWQgd2hvYW1pKHZvaWQpewoJCXByaW50X2FkZHIoX19QUkVUVFlfRlVOQ1RJT05fXywgdGhpcyk7CgkJc3RhdGljX2Nhc3Q8Y29uc3Qgd2l0aG91dF9yZWY+KCp0aGlzKS53aG9hbWkoKTsKCX0KfTsKCmludCBtYWluKCkgewoJd2l0aF9yZWYgd2l0aF9yZWZfaW5zdDsKCXdpdGhfcmVmX2luc3Qud2hvYW1pKCk7CgkKCXdpdGhvdXRfcmVmIHdpdGhvdXRfcmVmX2luc3Q7Cgl3aXRob3V0X3JlZl9pbnN0Lndob2FtaSgpOwoJcmV0dXJuIDA7Cn0=