template <typename Tag> struct IntPair{
int x, y;
IntPair& operator=(IntPair rhs){
x = rhs.x; y = rhs.y;
return *this;
}
template <typename Other>
IntPair& operator+=(const IntPair<Other>& rhs){ x += rhs.x; y += rhs.y; return *this; }
template <typename Other>
const IntPair operator+(const IntPair<Other>& rhs) const { IntPair<Tag> result = *this; return result += rhs; }
};
typedef IntPair<struct TagPosi> Position;
typedef IntPair<struct TagSize> Size;
int main(){
Size size = {10,10};
Position pos = { 5, 5};
pos += size;
}
dGVtcGxhdGUgPHR5cGVuYW1lIFRhZz4gc3RydWN0IEludFBhaXJ7CiAgaW50IHgsIHk7CgogIEludFBhaXImIG9wZXJhdG9yPShJbnRQYWlyIHJocyl7CiAgICB4ID0gcmhzLng7IHkgPSByaHMueTsKICAgIHJldHVybiAqdGhpczsKICB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlcj4KICBJbnRQYWlyJiBvcGVyYXRvcis9KGNvbnN0IEludFBhaXI8T3RoZXI+JiByaHMpeyB4ICs9IHJocy54OyB5ICs9IHJocy55OyByZXR1cm4gKnRoaXM7IH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyPgogIGNvbnN0IEludFBhaXIgb3BlcmF0b3IrKGNvbnN0IEludFBhaXI8T3RoZXI+JiByaHMpIGNvbnN0IHsgSW50UGFpcjxUYWc+IHJlc3VsdCA9ICp0aGlzOyByZXR1cm4gcmVzdWx0ICs9IHJoczsgfQp9OwoKdHlwZWRlZiBJbnRQYWlyPHN0cnVjdCBUYWdQb3NpPiBQb3NpdGlvbjsKdHlwZWRlZiBJbnRQYWlyPHN0cnVjdCBUYWdTaXplPiBTaXplOwoKaW50IG1haW4oKXsgCiAgU2l6ZSBzaXplID0gezEwLDEwfTsKICBQb3NpdGlvbiBwb3MgPSB7IDUsIDV9OwogIHBvcyArPSBzaXplOwp9