#include <iostream>
#include <cstdint>
using namespace std;
template<typename T, typename Ti>
T somefunc_impl(T* a, T* b)
{
Ti ai = *a;
Ti bi = *b;
return T(ai/bi);
}
template<typename T>
T somefunc(T* a, T* b, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0)
{
return somefunc_impl<T, double>(a, b);
}
template<typename T>
T somefunc(T* a, T* b, typename std::enable_if<!std::is_floating_point<T>::value >::type* = 0)
{
return somefunc_impl<T, int64_t>(a, b);
}
int main() {
{
float a = 3.0;
float b = 2.0;
cout << somefunc(&a, &b) << endl;
}
{
short a = 3;
short b = 2;
cout << somefunc(&a, &b) << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRpPgpUIHNvbWVmdW5jX2ltcGwoVCogYSwgVCogYikKewoJVGkgYWkgPSAqYTsKCVRpIGJpID0gKmI7CglyZXR1cm4gVChhaS9iaSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+ClQgc29tZWZ1bmMoVCogYSwgVCogYiwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPjo6dHlwZSogPSAwKQp7CglyZXR1cm4gc29tZWZ1bmNfaW1wbDxULCBkb3VibGU+KGEsIGIpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpUIHNvbWVmdW5jKFQqIGEsIFQqIGIsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA+Ojp0eXBlKiA9IDApCnsKCXJldHVybiBzb21lZnVuY19pbXBsPFQsIGludDY0X3Q+KGEsIGIpOwp9CgppbnQgbWFpbigpIHsKCXsKCQlmbG9hdCBhID0gMy4wOwoJCWZsb2F0IGIgPSAyLjA7CgkJY291dCA8PCBzb21lZnVuYygmYSwgJmIpIDw8IGVuZGw7Cgl9Cgl7CgkJc2hvcnQgYSA9IDM7CgkJc2hvcnQgYiA9IDI7CgkJY291dCA8PCBzb21lZnVuYygmYSwgJmIpIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQo=