函数模板参数列表
template< >
函数模板
//函数模板
template<typename T>
bool Compare(T a,T b)
{
cout<<"template Compare"<<endl;
return a>b;
}
模板类型参数
typename/class 参数类型
模板的实例化(显示实例化、隐式实例化) //在调用点实例化
//隐式实例化 //并没有指定出要实例化什么样的函数
//int -> 实例化模板 -> int Compare<int>
Compare<int>(10,20);
Compare<double>(10.1,20.2);
//显示实例化
template bool Compare<int>(int,int);
template bool Compare<double>(double,double);
template bool Compare<float>(float,float);
模板函数
//函数模板 ->实例化 -> 模板函数
bool Compare(int a,int b)
{
cout<<"template Compare"<<endl;
return a>b;
}
模板的非类型参数
必须是常量,不能是常变量
int SIZE //本身就是个常量,不能更改
模板的实参推演
//模板的实参推演
//实参的类型 -> 推演 -> 模板类型参数是什么
Compare(10,20);
模板的特例化(专用化)
//模板的特例化(专用化)
template<>
bool Compare<char*>(char* a,char* b)
{
cout <<"Compare<char*>(char* a,char* b)"<<endl;
return strcmp(a,b) > 0 ? true : false;
}
非函数模板
//非函数模板
bool Compare(int a,int b)
{
cout<<"Compare(int,int)"<<endl;
return a>b;
}
模板函数的重载
函数模板<->模板的特例化<->非函数模板 可以共存构成模板函数的重载
优先级 < <
小结:
1、模板的代码不进行编译 没有任何的实例化 没有产生任何的函数
模板的调用
2、模板的实例化是在编译阶段的
3、函数模板 只支持模板的完全特例化,不支持模板的部分特例化
只有类模板才支持模板的部分特例化