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