With function pointers you can achieve something like; in most cases even this is only possible at runtime:

 

 

PFvvE <--| do you see the problem here
PFvvE <--| f<int>,f<double>, yet the same name
Just one function f.
Just one function f.
f<double>
f<int>

In "type theory" that's not correct.
Two entity of different signature must have
different types. Otherwise a many to one
relationship takes place.