Qt中的C++技術 學習總結:(3)類型分類(Type Classification)技術

       設一個模板具有模板參數T,表示C++中的某種類型。有些情況下,隨着T所取類型的不同,該模板會做不同的處理。在設計該模板時,我們需要了解T的具體信息。在編寫一個具有模板參數T的類模板時,有時需要了解T所取類型的具體信息,以做不同的處理。這是一個棘手的問題,因爲C++語言只有很少幾個運算符能夠處理“類型”:sizeof、dynamic_cast以及typeid。和我們想要獲取的類型信息相比,這些運算符提供的信息太少。運算符sizeof只能夠求取一個類型的對象所佔用的內存空間。對於含有虛函數的類,dynamic_cast可被用來判斷一個對象是否具有某個類型,但是這個運算符只能施加到一個指針(或引用),不能施加到一個類型。運算符typeid倒是適用於所有類型(或者這些類型的對象),但是它只能獲得一個類型的名字信息。

    既然C++本身不能夠提供足夠詳細的信息,我們可以使用類模板特化技術,設計專門的類模板來提供所需信息,這種方法被稱爲類型分類(typeclassification)技術。我們以一個具體的例子來說明這種技術的原理。設想這樣一個任務:模板參數T是指針類型、引用類型或者數組類型中的某一種,我們需要判斷T究竟是其中的哪一個。如果是指針類型,需要知道該指針所指的類型,並將其命名爲baseT。還需要知道該類型最終涉及哪個C++基本類型,並將其命名爲bottomT。比如,對於指針類型int * *,baseT爲int *,而bottomT爲int。類似地,對於引用類型,baseT表示所引用的類型,bottomT表示該引用類型最終涉及哪個C++基本類型。比如,對於類型double * &,baseT爲double*,bottomT爲double。對於數組類型,baseT表示數組元素的類型,bottomT表示該數組類型最終涉及哪個C++基本類型。比如,設有數組類型typedef int * arrayType[100],baseT爲int *,而bottomT爲int。類模板特化技術可解決這個問題。如代碼段,主類模板定義了一組枚舉常量,每個枚舉常量的取值表示模板參數T是否具有對應的類別。比如,IsPtrT爲1則表示T是指針類型,爲0則表示T不是指針類型。

#ifndef TYPECLASSIFICATION_H
#define TYPECLASSIFICATION_H


// Type Classification 類型分類技術
/**
  * sizeof()   能夠求取一個類型的對象所佔用的內存空間
  * dynamic_cast  對於含有虛函數的類,可被用來判斷一個對象是否具有某個類型,但是這個運算符只能施加到一個指針(或引用),不能施加到一個類型
  * typeid()  適用於所有類型(或者這些類型的對象),但是它只能獲得一個類型的名字信息
  */


// 主類模板
template <typename T>
class TypeInfo{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef T bottomT;
};

// 特化類模板==>指針
template<typename T>
class TypeInfo<T*>{
  public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};

//特化類模板==》引用
template<typename T>
class TypeInfo<T&>
{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};

// 特化類模板==》數組
template <typename T,size_t N>
class TypeInfo<T[N]>
{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};


#endif // TYPECLASSIFICATION_H

      這種使用模板特化技術來描述模板參數T的類型信息的技術即被稱爲類型分類(type classification)。類型分類技術和traits技術很相似:都是利用模板特化技術描述一個類型的具體信息。但是二者的側重點有所不同,類型分類側重於描述一個類型的類別信息,比如它是否是指針、數組等,而traits技術側重於描述一個類型的具體信息,比如浮點數的表示範圍、精度等。

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