template<class Tag,typename Tag::type MemberPtr>
struct access_cast{
 friend typename Tag::type get(Tag){return MemberPtr;};
};
 
template<class Tag,class MemberPtr>
struct access_tag{
 typedef MemberPtr type;
 friend type get(Tag);
};
 
class A {
public:
 auto x() const {return x_;};
private: 
 int x_ = 9;
};
 
#include <iostream>
 
struct AMemTag: access_tag<AMemTag,int A::*>{}; //declare tag
template struct access_cast<AMemTag,&A::x_>; //define friend get function
 
int main() {
 A a;
 std::cout<<a.x()<<"\n";
 a.*get(AMemTag()) = 4; //dereference returned member pointer and modify value
 std::cout<<a.x()<<"\n";
}
				dGVtcGxhdGU8Y2xhc3MgVGFnLHR5cGVuYW1lIFRhZzo6dHlwZSBNZW1iZXJQdHI+CnN0cnVjdCBhY2Nlc3NfY2FzdHsKIGZyaWVuZCB0eXBlbmFtZSBUYWc6OnR5cGUgZ2V0KFRhZyl7cmV0dXJuIE1lbWJlclB0cjt9Owp9OwogCnRlbXBsYXRlPGNsYXNzIFRhZyxjbGFzcyBNZW1iZXJQdHI+CnN0cnVjdCBhY2Nlc3NfdGFnewogdHlwZWRlZiBNZW1iZXJQdHIgdHlwZTsKIGZyaWVuZCB0eXBlIGdldChUYWcpOwp9OwogCmNsYXNzIEEgewpwdWJsaWM6CiBhdXRvIHgoKSBjb25zdCB7cmV0dXJuIHhfO307CnByaXZhdGU6IAogaW50IHhfID0gOTsKfTsKIAojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgQU1lbVRhZzogYWNjZXNzX3RhZzxBTWVtVGFnLGludCBBOjoqPnt9OyAvL2RlY2xhcmUgdGFnCnRlbXBsYXRlIHN0cnVjdCBhY2Nlc3NfY2FzdDxBTWVtVGFnLCZBOjp4Xz47IC8vZGVmaW5lIGZyaWVuZCBnZXQgZnVuY3Rpb24KIAppbnQgbWFpbigpIHsKIEEgYTsKIHN0ZDo6Y291dDw8YS54KCk8PCJcbiI7CiBhLipnZXQoQU1lbVRhZygpKSA9IDQ7IC8vZGVyZWZlcmVuY2UgcmV0dXJuZWQgbWVtYmVyIHBvaW50ZXIgYW5kIG1vZGlmeSB2YWx1ZQogc3RkOjpjb3V0PDxhLngoKTw8IlxuIjsKfQ==