Qt中的C++技術 學習總結:(1)主類模板與特化類模板

    一個類模板可以具有一個或者多個模板參數。當這組模板參數被設定爲一組具體類型時,實例化後的類就能夠處理這組具體類型的數據。模板參數可以被設定爲任意類型,使得這個類模板可以處理任意類型的數據,這是泛型編程思想所要達到的目標。然而,在某些場合下,當模板參數被設定爲某些特定類型時,我們希望實例化後的類具有特定的行爲,這就需要使用類模板特化技術。

//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();
}

從最終的打印結果看以看到,在使用特化模板類 實例化對象時,可以做一些與衆不同的處理;而未作特化的類型,在使用主類模板實例化對象後,將會具有完全相同的操作(相同的成員函數的調用)。

可以說類模板特化,是泛型之中特別的亮點之一。接下來還要多總結,靈活使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章