template <typename T>
void arrayPrint(const T* const array,int count)
{
for(int i=0;i<count;count++)
{
count<<array[i]<<" ";
}
cout<<endl;
}
int main()
{
const int aCount=5;
const int bCount=7;
const int cCount=6;
int a[aCount]={1,2,3,4,5};
double b[bCount]={1.1, 2.2 3.3, 4.4, 5.5 ,6.6, 7.7};
char c[cCount]="hello";
cout<<"Array a contains:"<<endl;
arrayPrint(a,aCount);
cout<<"Array b contains:"<<endl;
arrayPrint(a,bCount);
cout<<"Array c contains:"<<endl;
arrayPrint(a,cCount);
}
@函数模板中的形参名只能在模板的头部声明一次,但是可以在函数头和函数体内重复使用,函数模板中的模板形参名不必是唯一的。
@一个函数模板同样可以被一个具有相同函数名但是不同函数参数的非模板函数所重载。
@编译器在函数调用时进行匹配处理来决定调用哪一个函数。
1,首先编译器会找出所有和调用函数的函数名相匹配的函数模板,然后根据调用函数的参数类型对函数模板进行特化。
2,然后编译器找出所有与调用函数相匹配的普通函数,如果一个普通函数或者函数模板特化与调用函数最匹配,那么这个普通函数或者函数模板特化将被调用。
3,如果函数模板特化和普通函数匹配程度相同,那么普通函数将被调用。
4,如果有多个函数和调用函数相匹配,将出现二义性,产生错误信息。
@类模板通过允许将泛型类实例化为明确的类来实现软件复用。
@类模板也称为参数化类型,因为它需要一种或多种参数类型来指出怎么样定制一个泛型类模板,从而构成类模板特化。
@类模板
template<typename t>
class Stack{
};
参数t表示将要创建的Stack类的类型。
@类模板定义中,可以使用非类型参数
例如:
template <typename a, int b>
还可以指定默认类型
template <typename A=string>,就可以使用 Stack<> m;来实例化一个名为m的string类型的Stack类模板特化。
默认的类型要在最右边,否则右边的所有参数都被忽略。
@类模板可以和全局函数,另一个类的成员函数,或者另一个类成为友元。