Compiler does not know, which overload of cb to chose.
2) Even if it did know, it would not convert from void* to, say void(*)(int), without any explicit conversion.
However, it can deduce it if you give compiler enough information:
void cb(int x)
{
std::cout <<"print inside integer callback : " << x << "\n" ;
}
void cb(float x)
{
std::cout <<"print inside float callback :" << x << "\n" ;
}
void cb(const std::string& x)
{
std::cout <<"print inside string callback : " << x << "\n" ;
}
int main()
{
void(*CallbackInt)(int);
void(*CallbackFloat)(float);
void(*CallbackString)(const std::string&);
CallbackInt = cb;
CallbackInt(5);
CallbackFloat = cb;
CallbackFloat(6.3);
CallbackString = cb;
CallbackString("John");
return 0;
}