先来看一个正常声明的函数形式:
//函数1
ReturnType func(Type1 x1,Type2 x2,...,Type9 x9)
{
return (ReturnType) x;
}
对于函数应用模板应该这样声明:
//函数2
Template<typename T,typename U> void func(T x1,U x2)
{
....
}
可以看出实际上就是在函数之前加上一个 t y p e n a m e typename typename的声明 T 、 U T、U T、U,即:
Template<typename T,typename U>
有了这个 T T T之后,可以在函数的任意一个部分用到它,比如返回值、参数类型、函数内部定义的任何类型如 i n t 、 f l o a t int、float int、float等。而基于这个模板函数的声明,可以在其上新加函数声明,用于特定类型参数的函数声明。比如:
//函数3
Template<> void func<int,float>(int x1,float x2)
{
.....
}
之后如果传入的 T T T是 i n t int int, U U U是 f l a o t flaot flaot,就可以调用这个 f u n c func func函数。
再说一些比较特殊类型的 T T T,我们之前见到的都是 t y p e n a m e typename typename形式的,然而 T T T也可以是 i n t 、 b o o l int、bool int、bool类型的参数。比如声明如下的函数:
//函数4
Template<int T,typename U> void func1()
{
U b;
printf("%d",T);
}
这个时候如果想要声明特定类型的 f u n c 1 func1 func1参数模板,可以这样声明:
Template<> void func1<1,int>()//函数5
{
printf("这里的T为1!");
}
这个时候如果想要调用这个 f u n c 1 func1 func1,传入的 T T T值必须为 1 1 1.
如果想要调用函数 4 4 4,需要这样写:
func1<2,int>();
当然也可以省去显示的类型说明,比如调用函数 2 2 2:
func(1,2);
这里面就是自动转换类型了。
如果想要调用特定类型的函数
5
5
5,需要这样写:
func1<1,int>();
如果第一个参数不是 1 1 1,那么推导不出来函数 5 5 5.