#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 T>
struct Printer
{
void Print();
void Print(Overload<Space2>);
void Print(Overload<Space3>);
};
template<typename Space>
struct Body : Printer<Space>
{
typedef typename Space::Vector vec;
vec v;
};
template<typename Space>
void Printer<Space>::Print(Overload<Space2>)
{
printf("%f", static_cast<Body<Space>*>(this)->v.X);
}
template<typename Space>
void Printer<Space>::Print(Overload<Space3>)
{
printf("%f", static_cast<Body<Space>*>(this)->v.x);
}
template<typename Space>
void Printer<Space>::Print()
{
Print(Overload<Space>());
}
int main()
{
Body<Space2> body;
body.Print();
return 0;
};
template
struct Body<Space2>;
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgVmVjdG9yMgp7CiAgZmxvYXQgWCwgWTsKfTsKCnN0cnVjdCBWZWN0b3IzCnsKICBmbG9hdCB4LCB5LCB6Owp9OwoKc3RydWN0IFNwYWNlMgp7CiAgdHlwZWRlZiBWZWN0b3IyIFZlY3RvcjsKfTsKCnN0cnVjdCBTcGFjZTMKewogIHR5cGVkZWYgVmVjdG9yMyBWZWN0b3I7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgT3ZlcmxvYWR7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBQcmludGVyCnsKICB2b2lkIFByaW50KCk7CiAgdm9pZCBQcmludChPdmVybG9hZDxTcGFjZTI+KTsKICB2b2lkIFByaW50KE92ZXJsb2FkPFNwYWNlMz4pOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2U+CnN0cnVjdCBCb2R5IDogUHJpbnRlcjxTcGFjZT4KewogIHR5cGVkZWYgdHlwZW5hbWUgU3BhY2U6OlZlY3RvciB2ZWM7CiAgCiAgdmVjIHY7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kdm9pZCBQcmludGVyPFNwYWNlPjo6UHJpbnQoT3ZlcmxvYWQ8U3BhY2UyPikKewogIHByaW50ZigiJWYiLCBzdGF0aWNfY2FzdDxCb2R5PFNwYWNlPio+KHRoaXMpLT52LlgpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kdm9pZCBQcmludGVyPFNwYWNlPjo6UHJpbnQoT3ZlcmxvYWQ8U3BhY2UzPikKewogIHByaW50ZigiJWYiLCBzdGF0aWNfY2FzdDxCb2R5PFNwYWNlPio+KHRoaXMpLT52LngpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kdm9pZCBQcmludGVyPFNwYWNlPjo6UHJpbnQoKQp7CiAgUHJpbnQoT3ZlcmxvYWQ8U3BhY2U+KCkpOwp9CgppbnQgbWFpbigpCnsKICBCb2R5PFNwYWNlMj4gYm9keTsKICBib2R5LlByaW50KCk7CiAgcmV0dXJuIDA7Cn07Cgp0ZW1wbGF0ZQpzdHJ1Y3QgQm9keTxTcGFjZTI+Ow==