#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;
}