出版時間:2010-1 出版社:機械工業(yè)出版社 作者:David Abrahams,Aleksey Gurtovoy 頁數(shù):277
Tag標簽:無
前言
1998年,Dave獲權參加在德國Dagstuhl Castle舉行的泛型編程研討會。在研討會臨近尾聲時,熱情的Kristof Czarnecki和Ullrich Eisenecker(在產(chǎn)生式編程領域頗有聲望)散發(fā)了一些C++源代碼,那是采用C++模板編寫的完整的Lisp實現(xiàn)清單。那時候,對于DaVe而言那不過是個新奇的玩具而已,是對模板系統(tǒng)迷人但不切實際的“劫持”,以證實我們可以編寫執(zhí)行于編譯期的程序。他從未想象有朝一日會在自己的大多數(shù)日常編程工作中發(fā)揮元編程(metaprogramming)的作用。在許多方面,那個模板代碼集合是B00st元編程庫(Metaprogramming Library,MPL)的先驅(qū):它可能是第一個設計用于將編譯期c++從一個特別的“模板技巧”集合轉(zhuǎn)變?yōu)檎?guī)的、易理解的軟件工程的范例的程序庫。隨著用于編寫和理解元程序(metaprogram)的高階工具的出現(xiàn),我們發(fā)現(xiàn)使用這些技術不但切實可行,而且簡單、有趣,并常常帶來令人驚訝的威力?! ∑查_存在許多采用模板元編程和MPL的真實系統(tǒng)不談,很多人仍然將元編程視作神秘的魔法,并且在日常產(chǎn)品代碼中避免使用它。如果你從未進行過任何元編程,你甚至都看不出它和你所做的工作有什么明顯的關系。在這本書中,我們希望能夠揭開它的神秘面紗,使你不但對如何進行元編程有所理解,對為何(以及何時)進行元編程也會有很好的認知。
內(nèi)容概要
《C++模板元編程》是關于C++模板元編程的著作?!禖++模板元編程》主要介紹Traits和類型操縱、深入探索元函數(shù)、整型外覆器和操作、序列與迭代器、算法、視圖與迭代器適配器、診斷、跨越編譯期和運行期邊界、領域特定的嵌入式語言、DSEL設計演練,另外附錄部分還介紹了預處理元編程概述、typename和template關鍵字。《C++模板元編程》通過理論聯(lián)系實踐,深入講解了C++高級編程技術?! 禖++模板元編程》適合中、高階C++程序員等參考?! 「劫浌獗P內(nèi)容包含所有Boost C++程序庫:Boost Metaprog ramming Library及其參考文件,還包含所有隨書代碼示例以及大量的補充材料。
作者簡介
David Abrahams,Boost C++程序庫開發(fā)組的一名發(fā)起成員和主持人。自從1996年起,Dave就是一名ANSI/ISO C++委員會成員,他因?qū)++標準程序庫異常處理的理論、規(guī)格和實現(xiàn)的貢獻而名聲鵲起。他的公司Boost Consulting提供了與Boost有關的支持和開發(fā)服務,以及軟件構建藝術的職業(yè)培訓?! leksey Gurtovoy,MetaCommunications的一名技術領導,并且是Boost C++社區(qū)的功勛成員。他是Boost MetaprogramminaLIbrary最初的作者。自1993年起他就開始研究C++并使用它工作,AIeksey擁有俄羅斯克拉斯諾雅茨克州立技術大學計算機科學理學碩士學位。
書籍目錄
譯者序序言前言致謝第1章 概述1.1 起步走1.2 元程序的概念1.3 在宿主語言中進行元編程1.4 在C++中進行元編程1.4.1 數(shù)值計算1.4.2 類型計算1.5 為何進行元編程1.5.1 替代方案1:運行期計算1.5.2 替代方案2:用戶分析1.5.3 為何進行C++元編程1.6 何時進行元編程1.7 為何需要元編程程序庫第2章 Traits和類型操縱2.1 類型關聯(lián)2.1.1 采用一種直接的方式2.1.2 采用一種迂回方式2.1.3 尋找一個捷徑2.2 元函數(shù)2.3 數(shù)值元函數(shù)23.4 在編譯期作出選擇2.4.1 進一步討論iter_swap2.4.2 美中不足2.4.3 另一個美中不足2.4.4 “美中不足”之外覆器2.5 Boost Type Traits程序庫概覽2.5.1 一般知識2.5.2 主類型歸類(Primary Type Categorization)2.5.3 次類型歸類(Secondary Type Categorization)2.5.4 類型屬性2.5.5 類型之間的關系2.5.6 類型轉(zhuǎn)化2.6 無參元函數(shù)2.7 元函數(shù)的定義2.8 歷史2.9 細節(jié)2.9.1 特化2.9.2 實例化2.9.3 多態(tài)2.10練習第3章 深入探索元函數(shù)3.1 量綱分析3.1.1 量綱的表示3.1.2 物理量的表示3.1.3 實現(xiàn)加法和減法3.1.4 實現(xiàn)乘法3.1.5 實現(xiàn)除法3.2 高階元函數(shù)3.3 處理占位符3.3.1 lambda元函數(shù)3.3.2 apply元函數(shù)3.4 lambda的其他能力3.4.1 偏元函數(shù)應用3.4.2 元函數(shù)復合3.5 Lambda的細節(jié)3.5.1 占位符3.5.2 占位符表達式的定義3.5.3 Lambda和非元函數(shù)模板3.5.4 “懶惰”的重要性3.6 細節(jié)3.7 練習第4章 整型外覆器和操作4.1 布爾外覆器和操作4.1.1 類型選擇4.1.2 緩式類型選擇4.1.3 邏輯運算符4.2 整數(shù)外覆器和運算4.2.1 整型運算符4.2.2 _c整型速記法4.3 練習第5章 序列與迭代器5.1 Concepts5.2 序列和算法5.3 迭代器5.4 迭代器Concepts5.4.1 前向迭代器5.4.2 雙向迭代器5.4.3 隨機訪問迭代器5.5 序列Concepts5.5.1 序列遍歷Concepts5.5.2 可擴展性5.5.3 關聯(lián)式序列5.5.4 可擴展的關聯(lián)式序列5.6 序列相等性5.7 固有的序列操作5.8 序列類5.8.1 list5.8.2 vector5.8.3 deque5.8.4 range_c5.8.5 map5.8.6 set5.8.7 iterator_range5.9 整型序列外覆器5.10 序列派生5.11 編寫你自己的序列5.11.1 構建tiny序列5.11.2 迭代器的表示5.11.3 為tiny實現(xiàn)at.5.11.4 完成tiny_iterator的實現(xiàn)5.11.5 begin和end5.11.6 加入擴充性5.12 細節(jié)5.13 練習第6章 算法6.1 算法、慣用法、復用和抽象6.2 MPL的算法6.3 插入器6.4 基礎序列算法6.5 查詢算法6.6 序列構建算法6.7 編寫你自己的算法6.8 細節(jié)6.9 練習第7章 視圖與迭代器適配器7.1 一些例子7.1.1 對從序列元素計算出來的值進行比較7.1.2 聯(lián)合多個序列7.1.3 避免不必要的計算7.1.4 選擇性的元素處理7.2 視圖Concept7.3 迭代器適配器7.4 編寫你自己的視圖7.5 歷史7.6 練習第8章 診斷8.1 調(diào)試錯誤8.1.1 實例化回溯8.1.2 錯誤消息格式化怪癖8.2 使用工具進行診斷分析8.2.1 聽取他者的意見8.2.2 使用導航助手8.2.3 清理場面8.3 有目的的診斷消息生成8.3.1 靜態(tài)斷言8.3.2 MPL靜態(tài)斷言8.3.3 類型打印8.4 歷史8.5 細節(jié)8.6 練習第9章 跨越編譯期和運行期邊界9.1 forl_each9.1.1 類型打印9.1.2 類型探訪9.2 實現(xiàn)選擇9.2.1 if語句9.2.2 類模板特化9.2.3 標簽分派9.3 對象生成器9.4 結(jié)構選擇9.5 類復合9.6 (成員)函數(shù)指針作為模板實參9.7 類型擦除9.7.1 一個例子9.7.2 一般化9.7.3 “手工”類型擦除9.7.4 自動類型擦除9.7.5 保持接口9.8 奇特的遞歸模板模式9.8.1 生成函數(shù)9.8.2 管理重載決議9.9 顯式管理重載集9.10 sizeof技巧9.11 總結(jié)9.12 練習第10章 領域特定的嵌入式語言10.1 一個小型語言10.2 路漫漫其修遠兮10.2.1 Make工具語言10.2.2 巴科斯一諾爾模式10.2.3 YACC10.2.4 DSL摘要10.3 DSL10.4 C++用作宿主語言10.5 Blitz++和表達式模板10.5.1 問題10.5.2 表達式模板10.5.3 更多的Blitz++魔法10.6 通用DSEL10.6.1 具名參數(shù)10.6.2 構建匿名函數(shù)10.7 BoostSpirit程序庫10.7.1 閉包10.7.2 子規(guī)則10.8 總結(jié)10.9 練習第11章 DSEL設計演練11.1 有限狀態(tài)機11.1.1 領域抽象11.1.2 符號11.2 框架設計目標11.3 框架接口基礎11.4 選擇一個DSL11.4.1 轉(zhuǎn)換表11.4.2 組裝成一個整體11.5 實現(xiàn)11.6 分析11.7 語言方向11.8 練習附錄A 預處理元編程簡介附錄B typename和template關鍵字附錄C 編譯期性能附錄D MPL可移植性摘要參考文獻
章節(jié)摘錄
第8章 診斷 因為c++元程序執(zhí)行于編譯期,所以給調(diào)試(debugging)工作帶來了特別的挑戰(zhàn)。沒有調(diào)試器允許我們單步跟蹤元程序的執(zhí)行,設置斷點,檢視數(shù)據(jù)等等。這類調(diào)試工作需要對編譯器內(nèi)部狀態(tài)的互動式探查。我們能做的全部事情,就是等待編譯過程失敗,然后破譯編譯器傾瀉到屏幕上的錯誤信息。c++模板的診斷(diagnostics)是一種常見的讓人感到挫折的源泉,因為它們通常與導致錯誤的原因沒有明顯的關系,并且呈現(xiàn)了大量的無用信息。在本章中,我們將討論如何理解元編程程序員通常遭遇的錯誤種類,甚至如何使得這些診斷屈服于我們的“邪惡”的目的。 c++標準將錯誤報告的具體實現(xiàn)方式完全留給編譯器實現(xiàn)者,因此我們將討論幾款不同的編譯器的行為,通常是以批評的措辭。因為你的編譯器的錯誤消息是你能得到的全部幫助,所以對工具的選擇會對你調(diào)試元程序的能力產(chǎn)生巨大的影響。如果你在構建程序庫,當出現(xiàn)錯誤時,你的客戶對工具的選擇將會影響他們對代碼的理解,也會影響到你花在回答問題上的時間。因此,即使當我們在討論你一般不使用的編譯器時,我們也建議你聚精會神,因為你也許會發(fā)現(xiàn)你希望將它加入自己的工具箱,或者,希望為可能使用該款編譯器的客戶提供特別的支持。同樣,如果我們看上去是在抨擊你喜歡的工具,希望你不要感覺自己受到了冒犯。 8.1 調(diào)試錯誤 這一節(jié)的標題實際上取自另一本書【VJ02】,但用在這本書里也極為切題。實際上,模板錯誤報告通常如此像《戰(zhàn)爭與和平》,很多程序員忽略它們并且求助于隨機的代碼并改來改去,希望能碰巧改正確。在這一節(jié)中,我們將為你提供工具來剔除那些冗長的診斷信息,并且?guī)椭阏业浇鉀Q問題的正確途徑。
媒體關注與評論
“如果你像我一樣,對人們在模板元編程(Template Metaprogrammin9,TMP)方面所做的工作感到興奮,但對缺乏這方面的清晰指導和強有力的工具感到沮喪。那好,這本書正是我們期待已久的。借助于優(yōu)秀的Boost Metaprogramming Library,DaVid和Afeksey將TMP從實驗室?guī)У搅松a(chǎn)一線,以易讀的文字和實際的例子向我們展示了‘編譯期STL’與其運行期對應物具有同樣的能耐。本書既可以作教程,也可以用作專家手冊。這是一本關于C++的扛鼎之作?!薄 狢huck Allison.The C++Source編輯
編輯推薦
本書清晰地揭示了現(xiàn)代C++最具威力的使用手法,將實際的工具和技術交付普通程序員的手中?! ≡幊淌钱a(chǎn)生或操縱程序碼的程序。自從泛型編程被引入C++中以來,程序員們已經(jīng)發(fā)現(xiàn)用于當程序被編譯時對其進行操縱的無數(shù)“tricks template”,這些tricks有效地消除了橫亙在程序和元編程之間的藩籬。盡管C++專家們對這種能力的興奮已經(jīng)波及整個C++社區(qū),然而它們的實際應用對于大多數(shù)程序員來說仍然是遙不可及。本書解釋了何謂元編程以及如何最佳化地使用 它,為你在自己的工作中有效地使用模板元編程提供了必備的基礎?! ”緯闇视谌魏问煜藴誓0鍘?Standard Template Library,STL)慣用法的程序員。C++高級用戶會獲得對既有工作新的洞察以及對元編程領域新的認知。那些已經(jīng)學習了一些高級模板技術的中級程序員將會明白這些tricks是從哪兒適合大畫面的。并將獲得有秩序地使用它們所需的概念基礎。對于那些已經(jīng)嗅到元編程味道但對其仍然感到神秘的程序員而言,最終將獲得對元編程如何工作、何時工作以及為何工作的清晰的理解。無論如何,所有讀者都將獲得一個可以自由支配的、威力空前的新工具:Boost MetaDroaramming Library。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載