#include <iostream>
#include <typeinfo>
using namespace std;
template <class T1, class T2>
auto iloczyn (T1 a, T2 b) -> decltype(a*b) {
cout<<"we've got: "<<typeid(decltype(a)).name()<<" and "<<typeid(decltype(b)).name()<<endl;
return a*b;
}
class test {
public:
double val;
test (double val = 0) : val(val) {}
friend test operator * (test a, test b) {
return test(a.val * b.val);
}
friend ostream & operator << (ostream &out, test a) {
return out<<a.val;
}
};
int main() {
cout<<iloczyn(2.4, test(2))<<endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgphdXRvIGlsb2N6eW4gKFQxIGEsIFQyIGIpIC0+IGRlY2x0eXBlKGEqYikgewoJY291dDw8IndlJ3ZlIGdvdDogIjw8dHlwZWlkKGRlY2x0eXBlKGEpKS5uYW1lKCk8PCIgYW5kICI8PHR5cGVpZChkZWNsdHlwZShiKSkubmFtZSgpPDxlbmRsOwoJcmV0dXJuIGEqYjsKfQoKY2xhc3MgdGVzdCB7CnB1YmxpYzoKCWRvdWJsZSB2YWw7Cgl0ZXN0IChkb3VibGUgdmFsID0gMCkgOiB2YWwodmFsKSB7fQoJZnJpZW5kIHRlc3Qgb3BlcmF0b3IgKiAodGVzdCBhLCB0ZXN0IGIpIHsKCQlyZXR1cm4gdGVzdChhLnZhbCAqIGIudmFsKTsKCX0KCglmcmllbmQgb3N0cmVhbSAmIG9wZXJhdG9yIDw8IChvc3RyZWFtICZvdXQsIHRlc3QgYSkgewoJCXJldHVybiBvdXQ8PGEudmFsOwoJfQp9OwoKaW50IG1haW4oKSB7Cgljb3V0PDxpbG9jenluKDIuNCwgdGVzdCgyKSk8PGVuZGw7Cn0K