一個類模板可以具有一個或者多個模板參數。當這組模板參數被設定爲一組具體類型時,實例化後的類就能夠處理這組具體類型的數據。模板參數可以被設定爲任意類型,使得這個類模板可以處理任意類型的數據,這是泛型編程思想所要達到的目標。然而,在某些場合下,當模板參數被設定爲某些特定類型時,我們希望實例化後的類具有特定的行爲,這就需要使用類模板特化技術。
//mystack.h
#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
#include <vector>
#include <deque>
#include <QDebug>
/// 主類模板
template <typename T>
class MyStack
{
public:
MyStack<T>(){
qDebug() << "class MyStack<T>";
}
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();
}
};
/// 特化類模板
template <>
class MyStack<int>
{
public:
MyStack<int>(){
qDebug() << "class MyStack<int>";
}
private:
std::vector<int> elems;
public:
void push(int const& elem){
qDebug() << "class MyStack<int>" ;
}
};
#endif // MYSTACK_H
// main.cpp
#include <QCoreApplication>
#include "mystack.h"
#include <QString>
#include <QDebug>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 使用特化類模板
MyStack<int> istack;
for (int var = 0; var < 100; ++var) {
istack.push(1);
qDebug() << var << endl;
}
// 使用主類模板
MyStack<QString> strStack;
for (int var = 0; var < 100; ++var) {
strStack.push(QString("string %1").arg(var));
}
return a.exec();
}
從最終的打印結果看以看到,在使用特化模板類 實例化對象時,可以做一些與衆不同的處理;而未作特化的類型,在使用主類模板實例化對象後,將會具有完全相同的操作(相同的成員函數的調用)。
可以說類模板特化,是泛型之中特別的亮點之一。接下來還要多總結,靈活使用。