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==