#include <iostream>
#include <vector>
template <typename T>
class example{
private:
T value;
public:
example(){ value=(T)0; }
example(const T& rhs){ value=rhs; }
~example(){}
T val() const { return value; }
};
template <typename T> inline class example<T> operator+(const class example<T>& lhs, const class example<T>& rhs){ return example<T>(lhs.val()+rhs.val()); }
template <typename T> inline class example<T> operator+(const class example<T>& lhs, const T & rhs){ return example<T>(lhs.val()+rhs ); }
template <typename T> inline class example<T> operator+(const T & lhs, const class example<T>& rhs){ return example<T>(lhs +rhs.val()); }
template <typename T>
void print(const class example<T>& rhs){ std::cout<<" = "<<rhs.val()<<std::endl; }
#define printn(var) {printf("%s", #var);print(var);}
#define printn_all(var) {printf("%s(%d): ", __func__, __LINE__);printf("%s", #var);print(var);}
int main(){
class example<double> v1(1.0), v2(2.0), v3(3.0), buf;
printn(v1);
printn(v2);
printn(v3);
printn(v1+v2+v3);
buf=0.1+v1+v2+v3+4.0;
printn(buf);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIGV4YW1wbGV7CnByaXZhdGU6CiAgICBUIHZhbHVlOwpwdWJsaWM6CiAgICBleGFtcGxlKCl7IHZhbHVlPShUKTA7IH0KICAgIGV4YW1wbGUoY29uc3QgVCYgcmhzKXsgdmFsdWU9cmhzOyB9CiAgICB+ZXhhbXBsZSgpe30KICAgIAogICAgVCB2YWwoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBjbGFzcyBleGFtcGxlPFQ+IG9wZXJhdG9yKyhjb25zdCBjbGFzcyBleGFtcGxlPFQ+JiBsaHMsIGNvbnN0IGNsYXNzIGV4YW1wbGU8VD4mIHJocyl7IHJldHVybiBleGFtcGxlPFQ+KGxocy52YWwoKStyaHMudmFsKCkpOyB9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgY2xhc3MgZXhhbXBsZTxUPiBvcGVyYXRvcisoY29uc3QgY2xhc3MgZXhhbXBsZTxUPiYgbGhzLCBjb25zdCAgICAgICAgICAgICAgIFQgJiByaHMpeyByZXR1cm4gZXhhbXBsZTxUPihsaHMudmFsKCkrcmhzICAgICAgKTsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIGNsYXNzIGV4YW1wbGU8VD4gb3BlcmF0b3IrKGNvbnN0ICAgICAgICAgICAgICAgVCAmIGxocywgY29uc3QgY2xhc3MgZXhhbXBsZTxUPiYgcmhzKXsgcmV0dXJuIGV4YW1wbGU8VD4obGhzICAgICAgK3Jocy52YWwoKSk7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHByaW50KGNvbnN0IGNsYXNzIGV4YW1wbGU8VD4mIHJocyl7IHN0ZDo6Y291dDw8IiA9ICI8PHJocy52YWwoKTw8c3RkOjplbmRsOyB9CgojZGVmaW5lIHByaW50bih2YXIpIHtwcmludGYoIiVzIiwgI3Zhcik7cHJpbnQodmFyKTt9CiNkZWZpbmUgcHJpbnRuX2FsbCh2YXIpIHtwcmludGYoIiVzKCVkKTogIiwgX19mdW5jX18sIF9fTElORV9fKTtwcmludGYoIiVzIiwgI3Zhcik7cHJpbnQodmFyKTt9CgppbnQgbWFpbigpewogICAgY2xhc3MgZXhhbXBsZTxkb3VibGU+IHYxKDEuMCksIHYyKDIuMCksIHYzKDMuMCksIGJ1ZjsKICAgIHByaW50bih2MSk7CiAgICBwcmludG4odjIpOwogICAgcHJpbnRuKHYzKTsKICAgIHByaW50bih2MSt2Mit2Myk7CiAgICAKICAgIGJ1Zj0wLjErdjErdjIrdjMrNC4wOwogICAgcHJpbnRuKGJ1Zik7CiAgICAKICAgIHJldHVybiAwOwp9