C++模版總結

函數模版:

1 模版函數使用時,是不允許自動類型轉換的,通過實參演繹,生成對應函數實例。

2,模版實參演繹不是和模版函數的返回類型, 可以通過交換模版參數位置,實現返回類型的顯示實例化。

3 函數模版實例通常被看成用來命名一組重載函數的集合,所以用函數模版實例 去演繹 函數模版參數時,需要指定該函數模版實例的具體類型。(C++ templates P37,這句話看了好幾天)

4 使用字符串引用參數的函數模版,C字符串長度不同,會實例化爲不同的函數模版實例。由於字符串是char const[]類型,如果模版參數是非引用參數,實參數組會退化成指針類型。

5 對於短小的模版函數,如果是聲明爲內聯,必須加上inline修飾符。


類模版:

1 成員函數只有在被使用時纔會實例化。

如果類模版中含有靜態成員,那麼實例化的每種類型,都會實例化這些靜態成員。

3 類模版有全特化和偏特化。

4 模版的模版參數爲類模版時,必須用class 來標誌參數,指明其爲模版類。

5 虛成員函數不能定義爲成員函數模版。

6 只有類模版聲明才能具有缺省模版實參

8 類模版特化的成員實現,不可以寫template<>。

9 對於那些在基類中聲明,並且依賴於模版參數的符號,應該前面使用this或者Base<T>::。

10 對於已經顯示實例化過的成員,就不能在此對這些成員顯示實例化。



模版參數類型

1 非類型的模版參數只能是常數(包括枚舉值),或者外面鏈接對象的指針以及引用。浮點書和類對象是不允許爲非類型模版參數。

2 使用字符串作爲函數模版實參,不要將函數參數聲明爲引用。

3 對於非引用類型的參數,在實參演繹過程中,會出現數組到指針的退化,


模版組織等問題

1 顯示實例化語法 http://docs.oracle.com/cd/E19205-01/820-1214/bkafi/index.html。

2 兩種包含模型方法    http://www.cnblogs.com/lvdongjie/p/4288373.html

3 包含頭文件應該使盡量多的頭文件順序一致,將版本比較穩定的頭文件放在前面。

4 類模版顯示實例化預留位置 

5 類模版偏特化預留位置


公共問題

1 缺省調用實參可以依賴於模版參數。

3 局部類,局部枚舉和未命名的class和枚舉不能作爲模版的類型實參。

4 缺省的函數參數,缺省的模版參數,缺省參數的後面參數必須都缺省。

5 模版的名字不具備C鏈接(待理解)

6 ADL 只能應用於非受限名稱

7 遇到POI位置時,編譯器必須看到相應模版的定義。

8 編譯長度爲零的數組,編譯器沒有報錯,和C++ templats P141有點衝突,負數確實報錯了。

9 編譯時期,若函數模版和成員模版函數爲實例化,編譯器對模版函數以及成員模版函數只做參數和返回類型檢查,函數裏面不做檢查。




友元類

1 友元類的聲明不能是類定義,可以命名一個特定的類模版實例爲友元

2 友元類爲類模版實例時,該模版的聲明必須可見,普通類怎不必要


友元函數

1 不能在友元聲明中定義一個模版實例,由於友元類不能是定義,故不會出現此類問題。普通友元函數可以出現定義,命名一個實例的友元聲明是不能作爲定義。看C++templates P111

2 在類定義中,受限的友元不能是函數的定義

3 如果名稱不受限,那麼該名稱一定不是引用一個模版實例(待理解)

4 在類模板內部定義友元函數,友元函數的參數類型或返回類型必須包含類模板的模板參數。否則該友元函數會被定義兩次。



POI位置(包含了實例化位置的解釋):

非類型顯示實例化的引用(C++templates用特化,感覺有點不對,不是吹毛求疵,裏面的概念太多,稍微混餚可能理解不對):包含這個引用的定義或聲明之後的最近名字空間域。

類實例的引用:包含這個實例引用的定義或聲明之前的最近名字空間域

實例化中又有實例化:實例化點外和內分別設爲POI1,POI2, POI1還是遵循上面規則。

POI2位置: 1 對於顯示實例化引用的,即非依賴型的引用,遵循上面的規則,放在引用處的上面或下面。

2 對於依賴型引用的,遵循上面的規則,放在POI1的上面或下面。

3 真正實例化位置選擇: 一個翻譯單元如果包含多個POI:

 類模板:在每個翻譯單元中,只有首個POI保留。

對於非類型實例:所有POI都會保留,但編譯器會選擇一個POI位置進行實例化(ODR原則要求所有的POI的實例化體都等價,這種等價性編譯器沒有保證也沒有檢查。實際應用中大多數編譯器會延遲非內聯函數模版的實例化,知道翻譯單元末尾 處,進行實例化。)


延遲實例化(講了實例化程度):

隱式實例化類模版:實例化該模版的每個成員聲明,不實例化相應的定義(除類模版中包含匿名union,虛函數的定義不一定實例化)

實例化函數或者成員函數:在被調用處實例化。(如果在函數調用過程中,確實用到了缺省實參,該實參也會被實例化。好像不對)


兩階段查找

第一階段:即編譯器第一次看到模版的時候、 編譯器會使用普通查找規則和ADL規則查找 非依賴型名稱。 用普通規則查找 依賴型受限函數名稱(函數參數是依賴型),保存查找結果,並不會試圖進行重載解析。

第二階段:在POI位置。 會使用普通查找規則和ADL規則查找依賴型受限名稱。依賴型非受限名稱則只使用ADL查找,然後綜合第一階段的普通查找規則進行重載解析。










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