#include <iostream>
template <class MemPtr, MemPtr p>
struct Accessor {
static MemPtr value() {
return p;
}
};
// ------------------------------------------------------
// Target Class
// privateメンバにアクセスされるクラス
struct A {
A(int mem1, int mem2):mem1(mem1), mem2(mem2) {}
void print() const {
std::cout << "mem1 = " << mem1 << " mem2 = " << mem2 << std::endl;
}
int mem1;
int mem2;
};
int main() {
A a(1, 2);
// メンバポインタを経由してのアクセス
std::cout << a.*&A::mem2 << std::endl;
// Accessorを経由して (設定済みの )mem にアクセス
std::cout << a.*Accessor<int A::*, &A::mem1>::value() << std::endl;
std::cout << a.*Accessor<int A::*, &A::mem2>::value() << std::endl;
a.*Accessor<int A::*, &A::mem1>::value() = 3;
a.*Accessor<int A::*, &A::mem2>::value() = 4;
a.print();
}
// Output:
/*
2
1
2
mem1 = 3 mem2 = 4
*/
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDxjbGFzcyBNZW1QdHIsIE1lbVB0ciBwPgpzdHJ1Y3QgQWNjZXNzb3IgewogICAgc3RhdGljIE1lbVB0ciB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gcDsKICAgIH0KfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBUYXJnZXQgQ2xhc3MKLy8gcHJpdmF0ZeODoeODs+ODkOOBq+OCouOCr+OCu+OCueOBleOCjOOCi+OCr+ODqeOCuQpzdHJ1Y3QgQSB7CiAgICBBKGludCBtZW0xLCBpbnQgbWVtMik6bWVtMShtZW0xKSwgbWVtMihtZW0yKSB7fQogICAgdm9pZCBwcmludCgpIGNvbnN0IHsgCiAgICAgICAgc3RkOjpjb3V0IDw8ICJtZW0xID0gIiA8PCBtZW0xIDw8ICIgbWVtMiA9ICIgPDwgbWVtMiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBpbnQgbWVtMTsKICAgIGludCBtZW0yOwp9OwoKaW50IG1haW4oKSB7CiAgICBBIGEoMSwgMik7CiAgICAvLyDjg6Hjg7Pjg5Djg53jgqTjg7Pjgr/jgpLntYznlLHjgZfjgabjga7jgqLjgq/jgrvjgrkKICAgIHN0ZDo6Y291dCA8PCBhLiomQTo6bWVtMiA8PCBzdGQ6OmVuZGw7CiAgICAvLyBBY2Nlc3NvcuOCkue1jOeUseOBl+OBpiAo6Kit5a6a5riI44G/44GuICltZW0g44Gr44Ki44Kv44K744K5CiAgICBzdGQ6OmNvdXQgPDwgYS4qQWNjZXNzb3I8aW50IEE6OiosICZBOjptZW0xPjo6dmFsdWUoKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgYS4qQWNjZXNzb3I8aW50IEE6OiosICZBOjptZW0yPjo6dmFsdWUoKSA8PCBzdGQ6OmVuZGw7CiAgICBhLipBY2Nlc3NvcjxpbnQgQTo6KiwgJkE6Om1lbTE+Ojp2YWx1ZSgpID0gMzsKICAgIGEuKkFjY2Vzc29yPGludCBBOjoqLCAmQTo6bWVtMj46OnZhbHVlKCkgPSA0OwogICAgYS5wcmludCgpOwp9Ci8vIE91dHB1dDoKLyoKMgoxCjIKbWVtMSA9IDMgbWVtMiA9IDQKKi8K