fork(2) download
  1. template<class Tag,typename Tag::type MemberPtr>
  2. struct access_cast{
  3. friend typename Tag::type get(Tag){return MemberPtr;};
  4. };
  5.  
  6. template<class Tag,class MemberPtr>
  7. struct access_tag{
  8. typedef MemberPtr type;
  9. friend type get(Tag);
  10. };
  11.  
  12. class A {
  13. public:
  14. auto x() const {return x_;};
  15. private:
  16. int x_ = 9;
  17. };
  18.  
  19. #include <iostream>
  20.  
  21. struct AMemTag: access_tag<AMemTag,int A::*>{}; //declare tag
  22. template struct access_cast<AMemTag,&A::x_>; //define friend get function
  23.  
  24. int main() {
  25. A a;
  26. std::cout<<a.x()<<"\n";
  27. a.*get(AMemTag()) = 4; //dereference returned member pointer and modify value
  28. std::cout<<a.x()<<"\n";
  29. }
Success #stdin #stdout 0s 3140KB
stdin
Standard input is empty
stdout
9
4