《C++ Templates 中文版》[陳偉柱譯]

 第1章 關於本書  ok
第1部分 基礎  
【模板就是可以使用不同類型的函數或類】
【相似函數怎麼辦?逐一實現(維護難!),類繼承(不檢查-->維護難),宏(蠢-->維護難)】
【模板是解決之道:嚴格檢查、編譯器多勞力、自己多勞心-->換來簡潔易維護代碼】
第2章 函數模板
2.1 初探函數模板  
 2.1.1 定義模板 【聲明時戴上尖帽子-->模板參數列表】
 2.1.2 使用模板  【像普通函數直接調用】
2.2 實參的演繹(deduction)  
【函數模板的‘實參推演’:編譯器根據‘調用參數’-->‘模板參數’-->內部其他類型】
【‘實例化’:編譯器創建函數實體。編譯器不只檢查語法正確,還要檢查當前調用合法-->代碼組織問題!】
2.3 模板參數
【基本不能得到返回參數-->必須顯示指定‘模板實參列表’-->max<...>()麻煩!】
【‘實參列表’形式可簡化!-->減少指定工作】
2.4 重載函數模板 【可以混合普通函數,編譯器自己選!一定要讓編譯器看見所有版本】
2.5 小結
第3章 類模板  
3.1 類模板Stack的實現  【定義實現都在hpp中】
 3.1.1 類模板的聲明
 【尖帽子+內部使用實際類類型】
【帶了帽子就不同了,定義中類類型是stack<T>,其他地方還是stack(構造函數名)】
 3.1.2 成員函數的實現  
【外部定義:尖帽子、類類型限定-->template<T> T stack<T>::pop(T t)】
【內部定義:都不要了】
3.2 類模板Stack的使用  
【不能從成員函數推演,必須‘顯示聲明類類型’指定模板實參--->stack<int> s】
【指定類類型也是推演!不必從成員函數推演】
【成員函數需要才編譯出函數實體,否則只是代碼-->殘疾類型也可以混進來】
【帽子太高需要typedef!>>hack!】
3.3 類模板的特化
【‘類模板特化’-->指定實參類類型-->空帽子+類類型】  
【成員函數成爲普通函數-->不戴帽子,但類類型小帽子存在!】
【基本類模板必須存在,全部成員函數都要特化-->否則(只要不用,編譯器不管)沒有特化整個類】
3.4 局部特化  
【在基本類模板基礎上,指定部分實參-->視爲新模板,但跳不出尖帽子框框】
【局部特化:定義時雙帽子!尖帽子可能縮小!-->template<T> stack<T,int> {}】
3.5 缺省模板實參  【定義時可以設置缺省值,可以引用前面參數-->調用參數減少-->引起困惑】
3.6 小結
 
第4章 非類型模板參數  【能否寫出對稱的變量帽子?-->沒必要了!就成爲普通函數】
4.1 非類型的類模板參數
【template<typename T,int MAX>-->不對稱的帽子:類型vs變量-->參與表達式】 
【定義時也是雙帽子:template<typename T,int MAX> T stack<T,MAX>::pop()】
【使用時也是不對稱帽子:stack<int,20> stack<int,40>-->不同的類型!】
4.2 非類型的函數模板參數
【也是不對稱帽子-->可參與表達式改造】 
【可以參與算法-->但是不能參與函數模板的實參推演-->強制轉換】
4.3 非類型模板參數的限制  【只能使用整數相關的類型!不能使用全局指針!extern解決問題】
4.4 小結
第5章 技巧性的基礎知識  
5.1 關鍵字typename  【受限帽子、.typename、->typename,詳見9.3.3
5.2 使用this->  【有基類的類模板應該顯示限制調用:this->foo()、base::foo()-->否則可能跑到全局函數】
5.3 成員模板  
【成員函數模板:引入新模板參數(可以推演)-->定義時戴上3層帽子!】
5.4 模板的模板參數
【stack<int,vect<int>>-->需要2次指定!希望stack<int,vect>-->把模板的參數指定爲模板型參數】
【沒用到的模板參數可以不寫,但保留typename】
改變了正常表達,編譯器由此淪爲宏編輯器!表達式模板?】
【函數模板不支持!】 
【由於指定類模板爲參數,所以需要用class】
5.5 零初始化  【應該初始化-->int等不能自動調構造函數-->顯示調用-->初始化列表】
5.6 使用字符串作爲函數模板的實參 【字符串可能引起問題】
5.7 小結
 
第6章 模板實戰  
6.1 包含模型   
 6.1.1 鏈接器錯誤  
 【普通函數:編譯{定義cpp得到obj,調用記錄在案},鏈接{在obj中查找}】
【模板函數:編譯{cpp不知調用參數所以不編譯函數實體,調用記錄在案,但沒有要求按int產生函數實體},鏈接{找不到}】
6.1.2 頭文件中的模板  【包含模型帶來大量頭文件,編譯時間長】
6.2 顯式實例化  
 6.2.1 顯式實例化的例子  【顯示實例化指示符 template class stack<int>,可以解決鏈接問題。但代碼維護問題出現】
 6.2.2 整合包含模型和顯式實例化
【雙頭一體:{聲明定義hpp}或{聲明hpp,顯示實例化cpp}】 
6.3 分離模型  【也叫導出模板】
 6.3.1 關鍵字export  
【提供專區供連接器查找!加在第一個聲明的前面 export template】
【不能和inline同用。可以用於其他】
 6.3.2 分離模型的限制  
 【缺點:2處處理產生不可見耦合。耦合導致定義文件變化處處重編譯;不可見導致額外分析工作保持更新】
6.3.3 爲分離模型做好準備  【處處EXPORT,用開關決定其內容】
6.4 模板和內聯   
【內聯函數往往置於hpp中-->錯覺:模板函數也是內聯NO!-->短小函數應該內聯!】
6.5 預編譯頭文件 【1.hpp包含不變頭文件,1.cpp使得產生預編譯頭文件,其他cpp包含1.hpp在最前面】 
6.6 調試模板  【語法語義違約有時難分別,使用concept違約】
 6.6.1 理解長段的錯誤信息  【哪個實例化錯了,爲什麼實例化,爲什麼錯】
 6.6.2 淺式實例化  
【深層實例化錯誤導致信息劇增!難以把握】
【方法1:提前測量。這種啞代碼複雜瑣碎,boost提供conceptchecklibrary】
 6.6.3 長符號串  【太長導致截斷】
 6.6.4 跟蹤程序 【小工具提供算法診斷】
 6.6.5 Oracles 【小工具增強版】
 6.6.6 Archetypes(原型)  
6.7 本章後記  
6.8 小結 
第7章 基本模板術語  
7.1 “類模板”還是“模板類”  【類模板】 
7.2 實例化和特化  【基模板-->實例化隱式特化-->顯示特化(空帽子)-->局部特化(雙帽子)】
7.3 聲明和定義 【定義分配內存,有了地址】 
7.4 一處定義原則   【只分配一處地址】
7.5 模板實參和模板參數
【模板實參是調用前需要推演用的,模板實參是調用時替換用的】
【stack<int>形成template-id,可以當作一個類型名稱,代表‘顯式替換’。缺省參數產生‘隱式替換’】
【模板實參必須是編譯器可定的模板實體或值。模板參數是編譯器實體所以可以用來產生模板實參】

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