#include <string>
#include <iostream>
class foo {
};
class bar {
public:
const foo & to_foo() const {
return f;
}
foo & to_foo() {
return f;
}
private:
foo f;
};
template< typename T, typename Enable = void>
class convert {};
template< typename T>
struct convert<T>{
static const foo & call1( const bar & b ) {
std::cout<<"call1"<<std::endl;
return b.to_foo();
}
static foo & call2( bar & b ) {
std::cout<<"call2"<<std::endl;
return b.to_foo();
}
};
int main()
{
bar b;
const bar cb = b;
convert<std::string> converter;
converter.call1(cb);
converter.call2(b);
return 0;
}
CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KY2xhc3MgZm9vIHsKfTsKCmNsYXNzIGJhciB7CiAgICBwdWJsaWM6CiAgICAgICAgY29uc3QgZm9vICYgdG9fZm9vKCkgY29uc3QgewogICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICB9CgogICAgICAgIGZvbyAmIHRvX2ZvbygpIHsKICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgfQogICAgcHJpdmF0ZToKICAgICAgICBmb28gZjsKfTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPgpjbGFzcyBjb252ZXJ0IHt9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIFQ+CnN0cnVjdCBjb252ZXJ0PFQ+ewogICAgc3RhdGljIGNvbnN0IGZvbyAmIGNhbGwxKCBjb25zdCBiYXIgJiBiICkgewogICAgICAgIHN0ZDo6Y291dDw8ImNhbGwxIjw8c3RkOjplbmRsOwogICAgICAgIHJldHVybiBiLnRvX2ZvbygpOwogICAgfQoKICAgIHN0YXRpYyBmb28gJiBjYWxsMiggYmFyICYgYiApIHsKICAgICAgICBzdGQ6OmNvdXQ8PCJjYWxsMiI8PHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gYi50b19mb28oKTsKICAgIH0KfTsKaW50IG1haW4oKQp7CiAgICBiYXIgYjsKICAgIGNvbnN0IGJhciBjYiA9IGI7CiAgICBjb252ZXJ0PHN0ZDo6c3RyaW5nPiBjb252ZXJ0ZXI7CiAgICBjb252ZXJ0ZXIuY2FsbDEoY2IpOwogICAgY29udmVydGVyLmNhbGwyKGIpOwoKICAgIHJldHVybiAwOwp9CiAg