主类模板Stack,使用vector构建,实现栈的功能。
template <typename T>
class Stack {
private:
std::vector<T> elems;
public:
void push(T const &elem){
elems.push_back(elem);
}
void pop(){
if(elems.empty()) return;
elems.pop_back();
}
T top() const{
if(elems.empty()) return;
return elems.back();
}
}
若模板参数是string,我们需要使用deque而不是vector来存放栈元素。这需要对类模板进行特化处理。看下面代码段。
template<>
class Stack<std::string> { //模板参数为特定string
private:
std::deque<std::string> elems;
public:
void push(std::string const &elem){
elems.push_back(elem);
}
void pop(){
if(elems.empty()) return;
elems.pop_back();
}
std::string top() const{
if(elems.empty()) return;
return elems.back();
}
}
实例化后的模板称为特化模板类。在这个代码段中,特化模板类只针对一个具体的类型(std::string),这种特化被称为完全特化。对于完全特化,首行template尖括号中内容应该为空。上述代码用deque完成栈操作。
有完全特化,就有部分特化。看下面代码。
template <typename T>
class Stack<T*> {
private:
std::list<T*> elems;
public:
void push(T* &elem){
elems.push_front(elem);
}
.... //same
}
首行声明T为模板参数,行2表示当模板参数需要是指针时,则不使用主类模板,而用特化模板。
一般情况下,设有一个主类模板:
template <typename T1,typename T2,...typename Tn>
class C {
...
}
特化的类模板应该具有的形式是:
template <typename P1,typename P2,...typename PN>
class C<type1,type2,...typeN> {
...
}
当主类模板的N个模板参数分别具有行2中的类型type1,type2…,时,编译器将使用特化类模板(而不是主类模板)中的代码来进行实例化操作。
行2中的type2(或者其它任意的一个)可以是一个确定的类型比如int,也可以是一个模板参数。对于后一种情形,需要在首行使用typename声明type2是一个类型名。例如:
template <typename T1,typename T2>//主类模板
class Myclass {
...
}
则以下代码定义了一个特化类模板,用来处理T2为int的情形:
template <typename T>
class Myclass<T,int> { //T2为int
...
}
而下面代码用来处理T1和T2都为指针的情形:
template <typename T1,typename T2>
class Myclass<T1*,T2*> {
...
}
时间: 2024-10-29 05:21:06