#include <iostream>
using namespace std;
char member_data[16];
template<typename T>
using member_func = void (T::*)();
template<typename T>
void set(member_func<T> member) {
reinterpret_cast<member_func<T>&>(member_data) = member;
}
template<typename T>
member_func<T> get() {
return reinterpret_cast<member_func<T>&>(member_data);
}
struct A {
void foo() {}
void bar() {}
};
int main() {
set(&A::foo);
member_func<A> g = get<A>();
cout << (g == &A::foo) << endl;
cout << (g == &A::bar) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2hhciBtZW1iZXJfZGF0YVsxNl07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp1c2luZyBtZW1iZXJfZnVuYyA9IHZvaWQgKFQ6OiopKCk7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIHNldChtZW1iZXJfZnVuYzxUPiBtZW1iZXIpIHsKICAgIHJlaW50ZXJwcmV0X2Nhc3Q8bWVtYmVyX2Z1bmM8VD4mPihtZW1iZXJfZGF0YSkgPSBtZW1iZXI7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+Cm1lbWJlcl9mdW5jPFQ+IGdldCgpIHsKICAgIHJldHVybiByZWludGVycHJldF9jYXN0PG1lbWJlcl9mdW5jPFQ+Jj4obWVtYmVyX2RhdGEpOwp9CgpzdHJ1Y3QgQSB7CiAgICB2b2lkIGZvbygpIHt9CiAgICB2b2lkIGJhcigpIHt9Cn07CgppbnQgbWFpbigpIHsgICAgCiAgICBzZXQoJkE6OmZvbyk7CiAgICBtZW1iZXJfZnVuYzxBPiBnID0gZ2V0PEE+KCk7CiAgICAKICAgIGNvdXQgPDwgKGcgPT0gJkE6OmZvbykgPDwgZW5kbDsKICAgIGNvdXQgPDwgKGcgPT0gJkE6OmJhcikgPDwgZW5kbDsKfQ==