#include <iostream>
#include <string>
template<typename T>
class Vector {
private:
T x, y, z;
public:
Vector(T x, T y, T z) : x(x), y(y), z(z) {}
// constructors, destructors, etc.
T X() const { return ( this->x ); }
T Y() const { return ( this->y ); }
T Z() const { return ( this->z ); }
template<typename U> auto operator+(const Vector<U> &v) const -> Vector<decltype(this->x + v.X())>
{
return ( Vector<decltype(this->x + v.X())>( this->x + v.X(), this->y + v.Y(), this->z + v.Z() ) );
}
};
int main() {
Vector<double> d1(1,2,3), d2(4,5,6);
std::cout << (d1 + d2).X();
Vector<int> d3(4,5,6);
std::cout << (d1 + d3).X();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgVmVjdG9yIHsKcHJpdmF0ZToKVCB4LCB5LCB6OwoKcHVibGljOgogICAgVmVjdG9yKFQgeCwgVCB5LCBUIHopIDogeCh4KSwgeSh5KSwgeih6KSB7fQogICAvLyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBldGMuCgogICBUIFgoKSBjb25zdCB7IHJldHVybiAoIHRoaXMtPnggKTsgfQogICBUIFkoKSBjb25zdCB7IHJldHVybiAoIHRoaXMtPnkgKTsgfQogICBUIFooKSBjb25zdCB7IHJldHVybiAoIHRoaXMtPnogKTsgfQoKICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gYXV0byBvcGVyYXRvcisoY29uc3QgVmVjdG9yPFU+ICZ2KSBjb25zdCAtPiBWZWN0b3I8ZGVjbHR5cGUodGhpcy0+eCArIHYuWCgpKT4KICAgewogICAgICAgcmV0dXJuICggVmVjdG9yPGRlY2x0eXBlKHRoaXMtPnggKyB2LlgoKSk+KCB0aGlzLT54ICsgdi5YKCksIHRoaXMtPnkgKyB2LlkoKSwgdGhpcy0+eiArIHYuWigpICkgKTsKICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBWZWN0b3I8ZG91YmxlPiBkMSgxLDIsMyksIGQyKDQsNSw2KTsKICAgIHN0ZDo6Y291dCA8PCAoZDEgKyBkMikuWCgpOwogICAgVmVjdG9yPGludD4gZDMoNCw1LDYpOwogICAgc3RkOjpjb3V0IDw8IChkMSArIGQzKS5YKCk7Cn0K