#include<type_traits>
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, typename std::enable_if< std::is_member_function_pointer< decltype( &T::to_foo ) >::value >::type > {
static const foo & call1( const bar & b ) {
return b.to_foo();
}
static foo & call2( bar & b ) {
return b.to_foo();
}
};
int main() {
bar b;
foo & f = convert<bar>::call2( b );
return 0;
}
I2luY2x1ZGU8dHlwZV90cmFpdHM+CgpjbGFzcyBmb28gewp9OwoKY2xhc3MgYmFyIHsKcHVibGljOgovKgogIGNvbnN0IGZvbyAmIHRvX2ZvbygpIGNvbnN0IHsKICAgIHJldHVybiBmOwogIH0KKi8KICBmb28gJiB0b19mb28oKSB7CiAgICByZXR1cm4gZjsKICB9CnByaXZhdGU6CiBmb28gZjsKfTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkID4KY2xhc3MgY29udmVydCB7fTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4Kc3RydWN0IGNvbnZlcnQ8IFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBzdGQ6OmlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPCBkZWNsdHlwZSggJlQ6OnRvX2ZvbyApID46OnZhbHVlID46OnR5cGUgPiB7CiAgc3RhdGljIGNvbnN0IGZvbyAmIGNhbGwxKCBjb25zdCBiYXIgJiBiICkgewogICAgcmV0dXJuIGIudG9fZm9vKCk7CiAgfQoKICBzdGF0aWMgZm9vICYgY2FsbDIoIGJhciAmIGIgKSB7CiAgICByZXR1cm4gYi50b19mb28oKTsKICB9Cn07CgppbnQgbWFpbigpIHsKICBiYXIgYjsKICBmb28gJiBmID0gY29udmVydDxiYXI+OjpjYWxsMiggYiApOwogIHJldHVybiAwOwp9