STL分析 準備工作《一》

2021-05-31 23:34:59 字數 1503 閱讀 2056

泛型設計之要點

模板發展起來,在c++語言發展過程中屬於意外發現,因而和基本的語法比較起來,是二等公民,語法支援不那麼優雅,**形式看著讓人很受傷,

c++11出來後,估計能好點,vs2010就引人了一些新特性,簡化了部分模板語法。

雖然模板在c++語法層面屬於二等公民,但是,從現在的趨勢來看,這幾年c++的主要改進點基本都集中在模板和模板相關的這塊,這塊也是c++和其他其他語言相抗衡的主要力量。

要分析stl,模板是基本的技術基礎,關於模板的基礎語法,這兒不談了,主要談下一些要點和難點

泛型設計之要點——模板推導順序

模板分函式模板和類模板,類模板支援偏特化(有點像高等數學中的偏導數),這是泛型程式設計的絕大多技術,技巧的根源。函式模板不支援偏特化,類似類模板偏特化的那些東西其實是函式過載。

(1)函式 模板的匹配規則

非模板函式具有最高的優先權。如果不存在匹配的非模板函式的話,那麼最匹配的和最特化的函式具有高優先權

普通非模板函式在引數匹配時如果和模板函式匹配度一樣好,優先選擇普通函式,因為一等公民嘛

幾個主模板函式中選擇匹配最好的

如果2選擇不出,選擇「最特化」的,最特化的如果又對模板實參做了特話,這個會被選中

出現二義性

模板特化不參與過載推導

templatevoid f(t);

template<>

void f(int*)

templatevoid f(t*)

答案是 第三個

(2) 類模板的匹配規則

最優化的優於次特化的,即模板引數最精確匹配的具有最高的優先權

例子:

template class vector; // (a)   普通型

template class vector; // (b) 對指標型別特化

template <> class vector ; // (c) 對void*進行特化

每個型別都可以用作普通型(a)的引數,但只有指標型別才能用作(b)的引數,而只有void*才能作為(c)的引數

泛型設計之要點——模板特化

模板有兩種特化,全特化和偏特化(區域性特化)

模板函式只能全特化,沒有偏特化(以後可能有)。

模板類是可以全特化和偏特化的。

全特化,就是模板中模板引數全被指定為確定的型別。

全特化也就是定義了乙個全新的型別,全特化的類中的函式可以與模板類不一樣。

偏特化,就是模板中的模板引數沒有被全部確定,需要編譯器在編譯時進行確定。

在泛型中,利用特化類得到類新的特性,以便找到最適合這種特性的實現。而這一切都是在編譯時完成。

模板的特化是非常有用的。它像乙個在編譯期的條件判斷。當編譯器在編譯時找到了符合的特化實現,就會使用這個特化實現。這就叫編譯器多型(或者叫靜態多型)。這種東西對編寫基礎庫是很有用的。這也就是為何c++的基礎庫大量使用了模板技術,而且大量使用了特化,特別是偏特化。

spring原始碼分析 準備工作

該專案會不定期更新,所以 上可能會有變化。spring版本 5.1.0.build snapshot 會定期合併master分支,該版本號會有改變 在basebean包下建立 multiconditionbean 具體 如下 xml具體配置內容如下圖 通過以上配置就可以建立測試 進行測試了,測試 包...

C lua準備工作

ubuntu源裡的lua是5.0的.而最新的是5.2.如果只是學習lua語法什麼的直接apt get就好了.不過如果想做c lua的嵌入工作.就只能自己下原始碼編譯了 步驟 1.依賴的庫 readline,ncurses 這兩個庫可以從網上下原始碼然後編譯安裝.這樣其實最好了 如果不嫌源裡的舊.其實...

單據準備工作

虛擬機器 uap studio nc home 單據開發 基於studio的 單開發。擴充套件開發 對 單進行夥伴級拓展。報表平台 基於 單的分組統計和交叉統計。輕量化 交通費報銷開發。報表平台 語義模型 自由報表 基於模型的開發 實體 列舉及他們之間的關係。實體屬性 資料型別 約束 與業務介面的對...