1.类模板的特化
特化模板就是通过模板实参来特化类模板,通过特化类模板,可以优化基于某种特定类型的实现。另外,如果要特化一个类模板,你还要特化该类模板的所有成员函数,如果只是特化某个成员函数,也就没有特化整个模板类。
为了特化一个类模板,你必须在起始处声明一个template<>,用来特化类模板。
template<> class Stack<std::string>
{
public:
void push<std::string>(std::string const& str);
..........
};
template<>
void Stack<std::string>:: push<std::string>(std::string const&str)
{
}
2.类模板的局部特化
类模板的局部特化就是在特定的环境下指定类模板的特定实现,并且要求某些模板的参数仍然由用户自己来定义。
特如类模板:
template<typename T1,typename T2>
class Myclass{
};
就可以有以下几种情况:
- 两个模板参数具有相同的类模板
template<typename T>
class Myclass<T ,T>{
};
或者
class Myclass<*T ,*T>{
};
- 第二个模板参数的类型为具体类型,如int
template<typename T>
class Myclass<T,int>{
};
- 两个模板参数的都是指针类型
template<typename T1,typename T2>
class Myclass<*T1,*T2>{
};
注:
- 类模板的特化和局部特化不能包含缺省的实参值
- 类模板的特化没有重载,但函数模板可以