通常模版声明与定义都放在头文件{\red{通常模版声明与定义都放在头文件}}通常模版声明与定义都放在头文件
分为函数模版,类模版。
模版类和模版函数的区别在于:模版类只能显示调用{\red{模版类和模版函数的区别在于:模版类只能显示调用}}模版类和模版函数的区别在于:模版类只能显示调用
使用模版的意义在于复用代码,
但可能会出现代码膨胀,即目标二进制代码臃肿,影响运行效率,例如:
template<class T,int num>
class A{
};
int main(){
A<int,1> a1;
A<int,2> a2;
return 0;
}
模版第二个参数应该分离出去,变为类内参数。
特化:{\red{特化:}}特化:
分为函数模版特化,类模版特化。
即,当模版参数不同时,采用的操作步骤也可能不同。
函数特化:
template<class T>
bool is(T x,T y){
return x == y;
}
template<>
bool is(char* x,char* y){
return strcmp(x,y) == 0;
}
类特化:
template<class T>
class A{
public:
bool is(T x,T y){
return x == y ;
}
};
template<>
class A<char*>{
public:
bool is(const char* x,const char* y){
return strcmp(x,y)==0;
}
};
int main(){
A<int> a;
A<char*> b;
cout<<a.is(1,2)<<endl;
cout<<b.is("123","123")<<endl;
return 0;
}
所以,选择函数模版是编译时决定,类模版实例由程序员显示指定。{\red{所以,选择函数模版是编译时决定,类模版实例由程序员显示指定。}}所以,选择函数模版是编译时决定,类模版实例由程序员显示指定。
全部特化:
template<class A,class B>
class X{};
template<>
class X<int,string>{};
部分特化:
template<class A,class B>
class X{};
template<class A>
class X<A,string>{};