#include <iostream>
#include <functional>
using namespace std;
template<class F>
void register_handler( F f ) // any callable object
{
if(std::is_same<int, typename F::argument_type>::value)
{ cout << "int\n";}
if(std::is_same<double, typename F::argument_type>::value)
{ cout << "double\n";}
f(5);
f(5.0);
}
void fint(int v)
{
cout << "fint\n";
}
void fdbl(double v)
{
cout << "fdbl\n";
}
int main() {
register_handler(std::function<void(int)>(fint));
register_handler(std::function<void(double)>(fdbl));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIEY+CnZvaWQgcmVnaXN0ZXJfaGFuZGxlciggRiBmICkgLy8gYW55IGNhbGxhYmxlIG9iamVjdAp7CiAgIGlmKHN0ZDo6aXNfc2FtZTxpbnQsIHR5cGVuYW1lIEY6OmFyZ3VtZW50X3R5cGU+Ojp2YWx1ZSkKICAgeyBjb3V0IDw8ICJpbnRcbiI7fQogICBpZihzdGQ6OmlzX3NhbWU8ZG91YmxlLCB0eXBlbmFtZSBGOjphcmd1bWVudF90eXBlPjo6dmFsdWUpCiAgIHsgY291dCA8PCAiZG91YmxlXG4iO30KICAgCiAgIGYoNSk7CiAgIGYoNS4wKTsKfQoKdm9pZCBmaW50KGludCB2KQp7Cgljb3V0IDw8ICJmaW50XG4iOwp9Cgp2b2lkIGZkYmwoZG91YmxlIHYpCnsKCWNvdXQgPDwgImZkYmxcbiI7Cn0KCmludCBtYWluKCkgewoJCglyZWdpc3Rlcl9oYW5kbGVyKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPihmaW50KSk7CglyZWdpc3Rlcl9oYW5kbGVyKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUpPihmZGJsKSk7CgkKCXJldHVybiAwOwp9