模板特殊化(Template specialization)

在chromium中實現了urple,用到了模板特殊化。base/turple.h

來自: http://hi.baidu.com/yzmforever123/item/5ce760521239219408be17a4


模板的特殊化是當模板中的pattern有確定的類型時,模板有一個具體的實現。例如假設我們的類模板pair 包含一個取模計算(module operation)的函數,而我們希望這個函數只有當對象中存儲的數據爲整型(int)的時候才能工作,其他時候,我們需要這個函數總是返回0。這可以通過下面的代碼來實現:

// Template specialization

#include <iostream.h>

template <class T> class pair {

    T value1, value2;

public:

    pair (T first, T second){

        value1=first;

        value2=second;

    }

    T module () {return 0;}

};

template <>

class pair <int> {

    int value1, value2;

public:

    pair (int first, int second){

        value1=first;

        value2=second;

    }

    int module ();

};

template <>

int pair<int>::module() {

    return value1%value2;

}

int main () {

    pair <int> myints (100,75);

    pair <float> myfloats (100.0,75.0);

    cout << myints.module() << '\n';

    cout << myfloats.module() << '\n';

    return 0;

}

25

0

template <> class class_name <type>

這個特殊化本身也是模板定義的一部分,因此,我們必須在該定義開頭寫template <>。而且因爲它確實爲一個具體類型的特殊定義,通用數據類型在這裏不能夠使用,所以第一對尖括號<> 內必須爲空。在類名稱後面,我們必須將這個特殊化中使用的具體數據類型寫在尖括號<>中。

當我們特殊化模板的一個數據類型的時候,同時還必須重新定義類的所有成員的特殊化實現(如果你仔細看上面的例子,會發現我們不得不在特殊化的定義中包含它自己的構造函數 constructor,雖然它與通用模板中的構造函數是一樣的)。這樣做的原因就是特殊化不會繼承通用模板的任何一個成員。


在chromium的自定義消息的消息參數中用到了template specializing






參考:

http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html


發佈了66 篇原創文章 · 獲贊 16 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章