#include <iostream>
using namespace std;
template <typename T> class Coor;
template <typename T> T getX(const Coor<T>& c);
template <typename T> T getY(const Coor<T>& c);
template <typename T>
class Coor {
friend T getX<>(const Coor<T>& c);
friend T getY<>(const Coor<T>& c);
private:
T x;
T y;
public:
Coor(const T& a, const T& b) : x(a), y(b) {}
};
template <typename T>
T getX(const Coor<T>& c) {
return c.x;
}
template <typename T>
T getY(const Coor<T>& c) {
return c.y;
}
int main() {
Coor<int> coor(0, 1);
Coor<double> dcoor(0.123, 12.345);
cout << getX(coor) << ", " << getY(coor) << endl;
cout << getX(dcoor) << ", " << getY(dcoor) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBDb29yOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBnZXRYKGNvbnN0IENvb3I8VD4mIGMpOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBnZXRZKGNvbnN0IENvb3I8VD4mIGMpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIENvb3IgewogICAgZnJpZW5kIFQgZ2V0WDw+KGNvbnN0IENvb3I8VD4mIGMpOwogICAgZnJpZW5kIFQgZ2V0WTw+KGNvbnN0IENvb3I8VD4mIGMpOwogIHByaXZhdGU6CiAgICBUIHg7CiAgICBUIHk7CiAgcHVibGljOgogICAgQ29vcihjb25zdCBUJiBhLCBjb25zdCBUJiBiKSA6IHgoYSksIHkoYikge30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpUIGdldFgoY29uc3QgQ29vcjxUPiYgYykgewogICAgcmV0dXJuIGMueDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQgZ2V0WShjb25zdCBDb29yPFQ+JiBjKSB7CiAgICByZXR1cm4gYy55Owp9CgppbnQgbWFpbigpIHsKICAgIENvb3I8aW50PiBjb29yKDAsIDEpOwogICAgQ29vcjxkb3VibGU+IGRjb29yKDAuMTIzLCAxMi4zNDUpOwogICAgY291dCA8PCBnZXRYKGNvb3IpIDw8ICIsICIgPDwgZ2V0WShjb29yKSA8PCBlbmRsOwogICAgY291dCA8PCBnZXRYKGRjb29yKSA8PCAiLCAiIDw8IGdldFkoZGNvb3IpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==