#include <stdio.h>
struct Vector2
{
float X, Y;
};
struct Vector3
{
float x, y, z;
};
struct Space2
{
typedef Vector2 Vector;
};
struct Space3
{
typedef Vector3 Vector;
};
template<typename T>
struct Overload{};
template<typename Space>
struct Body
{
typename Space::Vector v;
void Print(Overload<Space2>);
void Print(Overload<Space3>);
void Print();
};
template<typename Space>
void Body<Space>::Print(Overload<Space2>)
{
printf("%f", v.X);
}
template<typename Space>
void Body<Space>::Print(Overload<Space3>)
{
printf("%f", v.x);
}
template<typename Space>
void Body<Space>::Print()
{
Print(Overload<Space>());
}
int main()
{
Body<Space2> body;
body.Print();
return 0;
};
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgVmVjdG9yMgp7CiAgZmxvYXQgWCwgWTsKfTsKCnN0cnVjdCBWZWN0b3IzCnsKICBmbG9hdCB4LCB5LCB6Owp9OwoKc3RydWN0IFNwYWNlMgp7CiAgdHlwZWRlZiBWZWN0b3IyIFZlY3RvcjsKfTsKCnN0cnVjdCBTcGFjZTMKewogIHR5cGVkZWYgVmVjdG9yMyBWZWN0b3I7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgT3ZlcmxvYWR7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgpzdHJ1Y3QgQm9keQp7CiAgdHlwZW5hbWUgU3BhY2U6OlZlY3RvciB2OwoKICB2b2lkIFByaW50KE92ZXJsb2FkPFNwYWNlMj4pOwogIHZvaWQgUHJpbnQoT3ZlcmxvYWQ8U3BhY2UzPik7CiAgdm9pZCBQcmludCgpOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2U+CnZvaWQgQm9keTxTcGFjZT46OlByaW50KE92ZXJsb2FkPFNwYWNlMj4pCnsKICBwcmludGYoIiVmIiwgdi5YKTsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kdm9pZCBCb2R5PFNwYWNlPjo6UHJpbnQoT3ZlcmxvYWQ8U3BhY2UzPikKewogIHByaW50ZigiJWYiLCB2LngpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kdm9pZCBCb2R5PFNwYWNlPjo6UHJpbnQoKQp7CiAgUHJpbnQoT3ZlcmxvYWQ8U3BhY2U+KCkpOwp9CgppbnQgbWFpbigpCnsKICBCb2R5PFNwYWNlMj4gYm9keTsKICBib2R5LlByaW50KCk7CiAgcmV0dXJuIDA7Cn07