#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
{
typedef typename Space::Vector vec;
vec 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+CgpzdHJ1Y3QgVmVjdG9yMgp7CiAgZmxvYXQgWCwgWTsKfTsKCnN0cnVjdCBWZWN0b3IzCnsKICBmbG9hdCB4LCB5LCB6Owp9OwoKc3RydWN0IFNwYWNlMgp7CiAgdHlwZWRlZiBWZWN0b3IyIFZlY3RvcjsKfTsKCnN0cnVjdCBTcGFjZTMKewogIHR5cGVkZWYgVmVjdG9yMyBWZWN0b3I7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgT3ZlcmxvYWR7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgpzdHJ1Y3QgQm9keQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBTcGFjZTo6VmVjdG9yIHZlYzsKICAKICB2ZWMgdjsKCiAgdm9pZCBQcmludChPdmVybG9hZDxTcGFjZTI+KTsKICB2b2lkIFByaW50KE92ZXJsb2FkPFNwYWNlMz4pOwogIHZvaWQgUHJpbnQoKTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgp2b2lkIEJvZHk8U3BhY2U+OjpQcmludChPdmVybG9hZDxTcGFjZTI+KQp7CiAgcHJpbnRmKCIlZiIsIHYuWCk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2U+CnZvaWQgQm9keTxTcGFjZT46OlByaW50KE92ZXJsb2FkPFNwYWNlMz4pCnsKICBwcmludGYoIiVmIiwgdi54KTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2U+CnZvaWQgQm9keTxTcGFjZT46OlByaW50KCkKewogIFByaW50KE92ZXJsb2FkPFNwYWNlPigpKTsKfQoKaW50IG1haW4oKQp7CiAgQm9keTxTcGFjZTI+IGJvZHk7CiAgYm9keS5QcmludCgpOwogIHJldHVybiAwOwp9Ow==