#include <iostream>
template<typename T, typename U>
auto helper(T a, U b, int) -> decltype (a/b) {
std::cout << "first" << std::endl;
return a/b;
}
template<typename T, typename U>
auto helper(T a, U b, ...) -> decltype (a * (U(1)/b)) {
std::cout << "second" << std::endl;
return a * (U(1)/b);
}
template<typename T, typename U>
auto smart_division(T a, U b) -> decltype (helper(a, b)) {
return helper(a, b, 0);
}
struct Test {
explicit Test(int) {}
};
int operator / (Test a, Test b) {
return 1;
}
int main() {
std::cout << smart_division(1.0, 2.0) << std::endl;
Test t{5};
std::cout << smart_division(1, t) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KYXV0byBoZWxwZXIoVCBhLCBVIGIsIGludCkgLT4gZGVjbHR5cGUgKGEvYikgewoJc3RkOjpjb3V0IDw8ICJmaXJzdCIgPDwgc3RkOjplbmRsOwoJcmV0dXJuIGEvYjsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KYXV0byBoZWxwZXIoVCBhLCBVIGIsIC4uLikgLT4gZGVjbHR5cGUgKGEgKiAoVSgxKS9iKSkgewoJc3RkOjpjb3V0IDw8ICJzZWNvbmQiIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiBhICogKFUoMSkvYik7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmF1dG8gc21hcnRfZGl2aXNpb24oVCBhLCBVIGIpIC0+IGRlY2x0eXBlIChoZWxwZXIoYSwgYikpIHsKICAgIHJldHVybiBoZWxwZXIoYSwgYiwgMCk7Cn0KCgpzdHJ1Y3QgVGVzdCB7CglleHBsaWNpdCBUZXN0KGludCkge30KfTsKaW50IG9wZXJhdG9yIC8gKFRlc3QgYSwgVGVzdCBiKSB7CnJldHVybiAxOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCBzbWFydF9kaXZpc2lvbigxLjAsIDIuMCkgPDwgc3RkOjplbmRsOwogICAgVGVzdCB0ezV9OwoJc3RkOjpjb3V0IDw8IHNtYXJ0X2RpdmlzaW9uKDEsIHQpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9