时间:2014.01.16
地点:基地——终于搬回基地实验室了,好冷啊!
——————————————————————————————————
通常来说,常规的模板具有很高的通用性,对各种数据类型都适用,就像通用计算机。但有时针对某一数据类型,我们需要特殊处理,于是我们不得不针对这一特定数据类型专门打造,但对于用户来说,看起来又都一样,因此我们需要对类模板进行特化。当然函数模板也可以特化。另外类模板的实例化有一个潜在问题,就是代码膨胀。每实例化一次,实例化的代码段就会被添加到程序代码空间来,使用类模板特化技术可以有效减少代码膨胀的问题。
主类模板,通俗来讲,就是那个最通用,泛化最强的模板。
完全特化:也称绝对特化,即直接对某一具体类型做特殊化处理。
部分特化:顾名思义,只特殊化部分参数,比如类型的某种特征:指针形式或者引用形式等
下面模板类使用容器构建一个栈Stack,首先我们构建一个主类模板,所有模板的特化工作也是在该主类模板的基础上进行的。
template<typename T> class Stack{ private: vector<T> elems; public: void push(const T &item){ elems.push_back(item); } void pop(){ if (elems.empty()) return; elems.pop_back(); } T top() const{ if (elems.empty()) return NULL; return elems.back(); } };现在我们想对模板特殊化一点,即当模板参数为string类型时,我们并不想要和上述一样的行为,比如我们想要用deque容器来实现存放元素,在这个代码段中,特化模板只针对这一个具体的类型。属于完全特化,完全特化首行的尖括号内容须为空。
template<> class Stack<string>{ private: deque<string> elems; public: void push(const string &item){ elems.push_back(item); } void pop(){ if (elems.empty()) return; } string top() const{ if (elems.empty()) return NULL; return elems.back(); } };
template<typename T> class Stack<T*>{ private: list<T*> list; public: void push(T* &item){ list.push_front(item); } void pop(){ if (list.empty()) return; list.pop_front(); } T* top() const{ if (list.empty()) return NULL; return list.front(); } };
当模板参数满足一些特殊条件时,我们使用特殊化模板来实例化,编译器会更具匹配精确度优先匹配精确度更高的实现,对于一般情形,任然使用主类模板进行实例化,一句话,特殊情况特殊处理,普通情况一般处理。
原文:http://blog.csdn.net/u012333003/article/details/18355403