#include <iostream>
using namespace std;
template <typename T>
struct Coor
{
T x, y;
Coor(const T &a = T(), const T &b = T()) : x(a), y(b) {}
};
template <typename T, int N>
struct Access
{
const T& operator() (const Coor<T> &coor) const;
};
template <typename T>
struct Access<T, 0>
{
const T& operator() (const Coor<T> &coor) const
{ return coor.x; }
};
template <typename T>
struct Access<T, 1>
{
const T& operator() (const Coor<T> &coor) const
{ return coor.y; }
};
int main()
{
Coor<int> coor(0, 1);
Access<int, 0> x_access;
Access<int, 1> y_access;
cout << x_access(coor) << ' ' << y_access(coor) << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQ29vcgp7CiAgICBUIHgsIHk7CgoJQ29vcihjb25zdCBUICZhID0gVCgpLCBjb25zdCBUICZiID0gVCgpKSA6IHgoYSksIHkoYikge30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTj4Kc3RydWN0IEFjY2Vzcwp7Cgljb25zdCBUJiBvcGVyYXRvcigpIChjb25zdCBDb29yPFQ+ICZjb29yKSBjb25zdDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQWNjZXNzPFQsIDA+CnsKCWNvbnN0IFQmIG9wZXJhdG9yKCkgKGNvbnN0IENvb3I8VD4gJmNvb3IpIGNvbnN0Cgl7IHJldHVybiBjb29yLng7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQWNjZXNzPFQsIDE+CnsKCWNvbnN0IFQmIG9wZXJhdG9yKCkgKGNvbnN0IENvb3I8VD4gJmNvb3IpIGNvbnN0Cgl7IHJldHVybiBjb29yLnk7IH0KfTsKCmludCBtYWluKCkKewoJQ29vcjxpbnQ+IGNvb3IoMCwgMSk7CglBY2Nlc3M8aW50LCAwPiB4X2FjY2VzczsKCUFjY2VzczxpbnQsIDE+IHlfYWNjZXNzOwoKCWNvdXQgPDwgeF9hY2Nlc3MoY29vcikgPDwgJyAnIDw8IHlfYWNjZXNzKGNvb3IpICA8PCAnXG4nOwoJcmV0dXJuIDA7Cn0KCg==