泛型設計之要點
模板發展起來,在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的 單開發。擴充套件開發 對 單進行夥伴級拓展。報表平台 基於 單的分組統計和交叉統計。輕量化 交通費報銷開發。報表平台 語義模型 自由報表 基於模型的開發 實體 列舉及他們之間的關係。實體屬性 資料型別 約束 與業務介面的對...