- 具体化分为:
- 全部具体化
- 部分具体化
- 个数具体化:指定模板中某个参数的类型
- 范围具体化:参数代表数据类型、数据类型的指针
一定要注意下面的代码
- 全部具体化
什么叫具体化。个人认为:声明对象指定某一具体的类型,选用具体的 class 或者 struct
#include <iostream>
#include <string>
//先定义一个class模板,
template<typename T>
class Myvector{
private:
T m_node;
public:
Myvector(){
std::cout<<"this is template class"<<std::endl;
}
//...
};
//具体化,当模板参数类型为double时选用该类
template<> class Myvector<double>{
private:
double m_node;
public:
Myvector(){
std::cout<<"this is double class"<<std::endl;
}
//other function about double
};
//具体化,当模板参数类型为int时选用该类
template<> class Myvector<int>{
private:
int m_node;
public:
Myvector(){
std::cout<<"this is int class"<<std::endl;
}
//other function about int
};
int main(){
Myvector<int> v_t; //使用int类型的偏特化模板
Myvector<double> v_f; //使用double类型的偏特化模板
Myvector<std::string> v_s;//因为没有string类型的偏特化,所以使用模板class
return 0;
}
- 部分具体化
- 个数具体化,(感觉跟 全部具体化差不多,这个有默认参数,其他都相同)
#include <iostream>
#include <string>
//先定义一个泛化模板,
template<typename T,typename T2 = string>
class Myvector{
private:
T m_node;
T2 m_node1;
public:
Myvector(){
std::cout<<"this is template class"<<std::endl;
}
//...
};
//具体化,当模板参数类型其中一个为double时选用该类,另一个可以为任何类型
template<typename T> class Myvector<double,T>{
private:
double m_node;
T m_node1;
public:
Myvector(){
std::cout<<"this is double class"<<std::endl;
}
//other function about double
};
int main(){
Myvector<double> v_f;
Myvector<std::string> v_s;
return 0;
}
-
- 范围具体化
#include <iostream>
#include <string>
//先定义一个泛化模板,
template<typename T>
class Myvector{
private:
T m_node;
public:
Myvector(){
std::cout<<"this is template class"<<std::endl;
}
//...
};
//具体化,当模板参数类型为指针时选用该类
template<typename T> class Myvector<T*>{
private:
T m_node1;
public:
Myvector(){
std::cout<<"this is T* class"<<std::endl;
}
//other function pointer double
};
int main(){
Myvector<double*> v_d_p;
Myvector<double> v_d;
return 0;
}