#include<iostream>
#include<typeinfo>
template<typename T1, typename T2, typename T3>
void foo(T1 a, T2 b, T3 c){
std::cout << typeid(a).name() << std::endl;
std::cout << typeid(b).name() << std::endl;
std::cout << typeid(c).name() << std::endl;
}
int main(){
// instantiate foo(double,short,float)
foo<double, short>(2.0d, 123, 1.f);
// instantiate foo(int,int,float)
foo<int>(2.0d, 123, 1.f);
// instantiate foo(double,int,float)
foo<double>(2.0d, 123, 1.f);
void (*pf)(double, int, short) = &foo<double>;
// instantiate foo(double,int,short)
pf(2,4,5);
return 0;
}