1、类模板的声明
templateclass Stack{ ...}
2、在类模板内部,T可以像其他任何类型一样,用于声明成员变量和成员函数。
templateclass Stack{private: std::vector elemes; // 存储元素的容器public: Stack(); // 构造函数 void Push(const T& e); // 压入元素 void Pop(); // 弹出元素 T Top() const; // 返回栈顶元素};
这个类的类型是Stack<T>,其中T是模板参数。
3、类模板具体例子
#include#include #include using namespace std;template class Stack{private: vector vec;public: void push(T const& elem); void pop(); T top() const; bool empty() const{ return vec.empty(); }};template void Stack ::push(T const& elem){ vec.push_back(elem);}template void Stack ::pop(){ if (vec.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } vec.pop_back();}template T Stack ::top() const{ if (vec.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } return vec.back();}int main(){ try{ Stack istk; istk.push(7); istk.push(8); istk.push(9); cout << istk.top() << endl; istk.pop(); cout << istk.top() << endl; Stack sstk; sstk.push("aaa"); sstk.push("bbb"); sstk.push("ccc"); cout << sstk.top() << endl; sstk.pop(); cout << sstk.top() << endl; } catch (exception const& ex){ cerr << "Exception:" << ex.what() << endl; return EXIT_FAILURE; } system("pause"); return 0;}
对于类模板,成员函数只有被调用的时候才被实例化。如果类模板中含有静态成员,那么用来实例化的每种类型,都会实例化静态成员。
4、类模板的特化
为了特化一个类模板,要在起始处声明一个template<>.接下来声明用来特化模版的类型,这个类型被用作模版实参。
//类模板的特化template<>class Stack{private: deque deq;public: void push(string const& elem); void pop(); string top() const; bool empty() const{ return deq.empty(); }};void Stack ::push(string const& elem){ deq.push_back(elem);}void Stack ::pop(){ if (deq.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } deq.pop_back();}string Stack ::top() const{ if (deq.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } cout << "模板的特化:"; return deq.back();}
5、局部特化
templateclass MyClass{ ...};// 局部特化,两个模板参数类型相同template class MyClass { ...};// 局部特化,第2个模板参数是inttemplate class MyClass { ...};// 局部特化,两个模板参数都是指针类型template class MyClass { ...};
6、缺省模板实参
可以为类模板的参数定义缺省值,这些值被称为缺省模板实参,还可以引用之前的模板参数。
下面例子中的vector<T>就是缺省模板实参:
#include#include #include #include using namespace std;template >class Stack{private: Container container;public: void push(T const& elem); void pop(); T top() const; bool empty() const{ return container.empty(); }};template void Stack ::push(T const& elem){ container.push_back(elem);}template void Stack ::pop(){ if (container.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } container.pop_back();}template T Stack ::top() const{ if (container.empty()){ throw out_of_range("Stack<>::pop():empty stack"); } return container.back();}int main(){ try{ Stack istk; istk.push(7); istk.push(8); istk.push(9); cout << istk.top() << endl; istk.pop(); cout << istk.top() << endl; Stack > sstk; sstk.push("aaa"); sstk.push("bbb"); sstk.push("ccc"); cout << sstk.top() << endl; sstk.pop(); cout << sstk.top() << endl; } catch (exception const& ex){ cerr << "Exception:" << ex.what() << endl; return EXIT_FAILURE; } system("pause"); return 0;}
版权声明:本文为博主原创文章,未经博主允许不得转载。