类模版的定义和声明都和函数模版类似:
代码如下:
template <typename T> class Stack { public: void push(const T&); void pop(); T top()const; bool empty() const{return m_elems.empty();} private: vector<T> m_elems; };
类模版的使用时需要显示指定模版参数类型。
类模版成员函数的是在调用的时候实例化
template<typename T> void Stack<T>::push(const T& elems) { m_elems.push_back(elems); } template<typename U> void Stack<U>::pop() { m_elems.pop_back(); }
参数推导过程,通过显示指定模版类型参数例如Stack<int> st;实例化一个模版类型是int的类st.pop()通过Stack<U>推导出U为int,然后依据函数模版的实例化方法实例化成员函数。
模版特化:作用是优化基于某种特定类型的实现。或者克服某种特定类型在实例化类模版时的不足。特化类模版时,同时要特化类中的成员函数,不然会造成,成员函数未定义现象。
template <> class Stack<double> { public: void push(const double&); void pop(); double top()const; //bool empty() const{return m_elems.empty();} private: vector<double> m_elems; }; void Stack<double>::push(const double&) { } void Stack<double>::pop() { } double Stack<double>::top() const { return 0.1; }
类模版的偏特化:偏特化也成为部分特化是特化一系列类型,实例化时不能产生二义性
根据特化,偏特化,普通实例化的优先级进行匹配
#include <iostream> #include <string> #include <vector> using namespace std; template<typename T1,typename T2> class Myclass { }; template<typename T> class Myclass<T,T> { }; template<typename T> class Myclass<T,int> { }; template<typename T1,typename T2> class Myclass<T1*,T2*> { }; int main() { Myclass<int,float> m1;//调用第一个 Myclass<float,float> m2;//调用第二个 Myclass<float,int> m3;//调用第三个 Myclass<int*,int*> m4;//调用第四个 Myclass<int,int> m5;//产生二义性 return 0; }
缺省模版实参
类模版缺省模版实参的优点是可以指定内部类型,以及自定义的容器
template<typename T,typename CONT = vector<T>> class Stack { public: void push(const T&); void pop(); T top()const; bool empty() const{return m_elems.empty();} private: CONT m_elems; };