#include <iostream>
#include <vector>
template <typename T> class example; // in order to extern
template <typename T> inline class example<T> example_add(const class example<T>& lhs, const class example<T>& rhs){ return example<T>(lhs.val()+rhs.val()); }
template <typename T> inline class example<T> example_add(const class example<T>& lhs, const T & rhs){ return example<T>(lhs.val()+rhs); }
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; }
class example<T> operator+(const class example<T>& rhs){ return example_add(*this, rhs); }
class example<T> operator+(const T & rhs){ return example_add(*this, rhs); }
};
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=v1+v2+v3+4.0;
printn(buf);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIGV4YW1wbGU7IC8vIGluIG9yZGVyIHRvIGV4dGVybgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBjbGFzcyBleGFtcGxlPFQ+IGV4YW1wbGVfYWRkKGNvbnN0IGNsYXNzIGV4YW1wbGU8VD4mIGxocywgY29uc3QgY2xhc3MgZXhhbXBsZTxUPiYgcmhzKXsgcmV0dXJuIGV4YW1wbGU8VD4obGhzLnZhbCgpK3Jocy52YWwoKSk7IH0KdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBjbGFzcyBleGFtcGxlPFQ+IGV4YW1wbGVfYWRkKGNvbnN0IGNsYXNzIGV4YW1wbGU8VD4mIGxocywgY29uc3QgICAgICAgICAgICAgICBUICYgcmhzKXsgcmV0dXJuIGV4YW1wbGU8VD4obGhzLnZhbCgpK3Jocyk7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBleGFtcGxlewpwcml2YXRlOgogICAgVCB2YWx1ZTsKcHVibGljOgogICAgZXhhbXBsZSgpeyB2YWx1ZT0oVCkwOyB9CiAgICBleGFtcGxlKGNvbnN0IFQmIHJocyl7IHZhbHVlPXJoczsgfQogICAgfmV4YW1wbGUoKXt9CiAgICBUIHZhbCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CiAgICAKICAgIGNsYXNzIGV4YW1wbGU8VD4gb3BlcmF0b3IrKGNvbnN0IGNsYXNzIGV4YW1wbGU8VD4mIHJocyl7IHJldHVybiBleGFtcGxlX2FkZCgqdGhpcywgcmhzKTsgfQogICAgY2xhc3MgZXhhbXBsZTxUPiBvcGVyYXRvcisoY29uc3QgICAgICAgICAgICAgICBUICYgcmhzKXsgcmV0dXJuIGV4YW1wbGVfYWRkKCp0aGlzLCByaHMpOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBwcmludChjb25zdCBjbGFzcyBleGFtcGxlPFQ+JiByaHMpeyBzdGQ6OmNvdXQ8PCIgPSAiPDxyaHMudmFsKCk8PHN0ZDo6ZW5kbDsgfQoKI2RlZmluZSBwcmludG4odmFyKSB7cHJpbnRmKCIlcyIsICN2YXIpO3ByaW50KHZhcik7fQojZGVmaW5lIHByaW50bl9hbGwodmFyKSB7cHJpbnRmKCIlcyglZCk6ICIsIF9fZnVuY19fLCBfX0xJTkVfXyk7cHJpbnRmKCIlcyIsICN2YXIpO3ByaW50KHZhcik7fQoKaW50IG1haW4oKXsKICAgIGNsYXNzIGV4YW1wbGU8ZG91YmxlPiB2MSgxLjApLCB2MigyLjApLCB2MygzLjApLCBidWY7CiAgICBwcmludG4odjEpOwogICAgcHJpbnRuKHYyKTsKICAgIHByaW50bih2Myk7CiAgICBwcmludG4odjErdjIrdjMpOwogICAgCiAgICBidWY9djErdjIrdjMrNC4wOwogICAgcHJpbnRuKGJ1Zik7CiAgICAKICAgIHJldHVybiAwOwp9