关于c++的特例化和实例化,这两个名词的名字就差不多,含义也容易被搞混,其实两者差别还是比较大的。
实例化(instantiation):
模板在调用之前都没有生成真正的代码,调用之后才会生成代码,这个生成代码的过程就叫做实例化,实例化是老老实实,原封不动地实例化的,比如:
//**模板函数实例化**
template<typename T>void print(T obj){
cout<<obj;
}//普通模板函数
template void print(int)//模板函数显示实例化定义
int a=2;//模板函数显示实例化
//第一种方式是声明所需的种类,用<>符号来指示类型,并在声明前加上关键词template,如下:
template void Swap<int>(int &, int &);
//第二种方式是直接在程序中使用函数创建,如下:
Swap<int>(a,b);
ptint(a);//模板函数隐式实例化
//**类模板实例化**
template<typename T>class goods{
T a;
}//普通模板类
template class goods<int>;//模板类显示实例化定义
goods<int> boxs;//模板类显示实例化
特例化(specialization):
特例化就是针对特定类型更改内部逻辑之后再实例化,当然,如果你比较老实,你也可以不改任何东西,比如:
//**模板函数特例化**
template<typename T>void print(T obj){
cout<<obj;
}//普通模板函数
template<>void print(vector<int> obj){
for(auto i:obj){
cout<<i<<endl;
}
}//模板函数特例版本,对int版本进行特例化,改变了内部逻辑结构,no problem
//**模板类特例化**
template<typename T>class goods{
T a;
}//普通模板类
template<>class goods<int>{
int a;
int b;
int get(){
return a;
}
}//模板类特例化版本,增加了一个成员变量,一个成员函数,no problem
这里针对vector<int>类型版本进行了特例化,对于该类型的输出方式变成了循环输出。逻辑发生变更,且顺便将模板实例出了代码。
偏特化
至于偏特化嘛,偏特化后本质上还是个模板,所以这东西只存在于模板类中,因为对于模板函数有重载机制,与其偏特化出个特殊模板,还不如重载个模板,所以编译器干脆不支持模板函数的偏特化。
template <typename T> class A{
T a;
}//普通模板类
A<int*>obj;
obj.a;//int*类型
template <typename T>class A<T*>{
T a;
T b;
}//模板类偏特化版本,本质上还是个模板,所以模板参数列表还有个T。
A<int*>obj;
obj.a;//int类型