C++ 新經典:模板與泛型編程

王健偉

  • 出版商: 清華大學
  • 出版日期: 2022-03-01
  • 售價: $534
  • 貴賓價: 9.5$507
  • 語言: 簡體中文
  • ISBN: 7302584648
  • ISBN-13: 9787302584643
  • 相關分類: C++ 程式語言
  • 立即出貨

  • C++ 新經典:模板與泛型編程-preview-1
  • C++ 新經典:模板與泛型編程-preview-2
  • C++ 新經典:模板與泛型編程-preview-3
C++ 新經典:模板與泛型編程-preview-1

買這商品的人也買了...

相關主題

商品描述

本書是一部詳細講解C++模板與泛型編程知識的書,針對的是希望系統學習C++模板與泛型編程、元編程相關開發知識的中高級C++開發者,所講解的知識具備一定的難度,書籍包含紙質圖書以及教學源代碼文件。編寫初衷是幫助讀者解決各種模板與泛型編程中的語法問題,以免在閱讀他人所寫的泛型編程代碼(如C++標準庫代碼、Boost庫代碼)時磕磕絆絆甚至進行不下去。此外,書中也會對一些比較有商業價值的源碼進行適當的分析和講解,以進一步提高讀者的實戰能力,更好的讓讀者利用模板與泛型編程技術編寫可復用的高質量代碼以及供第三方開發者使用的接口庫。 書籍有如下比較明顯的特點:①註重細節,註重基礎;②講解難度適宜,範例由淺入深;③內容比較全面;④支持C++11/14/17新標準。 全書共分7章:第1章搭建C++編程環境,第2~3章講述模板開發的基礎和進階知識,第4章介紹C++標準庫中常用的各種模板,第5~6章詳細通過眾多範例展示萃取技術、策略技術以及元編程,第7章動手編寫STL中的list容器和對應的迭代器實現源碼以期望讀者對list容器的實現細節有清晰掌握並觸類旁通。

目錄大綱

目錄

 

第1章 C++編程環境介紹 .....1

1.1 C++編程環境搭建說明 ...1

1.2 創建最基本的能運行的C++程序 .3

1.3 Visual Studio中程序的調試方法 ...5

1.3.1 普通的斷點調試(跟蹤調試) .5

1.3.2 學會調試時查看內存中的內容 .6

1.3.3  “快速監視”對話框 ....8

1.3.4 查看“反匯編”窗口 ...8

1.4 開啟Visual Studio 2019對C++最新標準的編譯支持 ...9

第2章 模板基礎知識 ....10

2.1 函數模板 ....10

2.1.1 基本範例 .....10

2.1.2 實例化 ...11

2.1.3 模板參數的推斷 .14

2.1.4 重載 17

2.1.5 特化 18

2.1.6 默認參數 .....21

2.1.7 非類型模板參數 .22

2.2 類模板、變量模板與別名模板 ....25

2.2.1 類模板的基本範例和模板參數的推斷 .25

2.2.2 類模板的特化 .....30

2.2.3 默認參數 .....35

2.2.4 類型別名 .....36

2.2.5 非類型模板參數 .36

2.2.6 成員函數模板 .....38

2.2.7 類/類模板中的類模板(類模板的嵌套) .45

2.2.8 變量模板與成員變量模板 46

2.2.9 別名模板與成員別名模板 49

2.2.10 模板模板參數 ...50

2.2.11 共享體模板(聯合模板) ....53

2.3 類模板中的友元 53

2.3.1 友元類 ...53

2.3.2 友元函數 .....56

2.4 可變參模板 60

2.4.1 可變參函數模板 .61

2.4.2 折疊表達式 ..65

2.4.3 可變參表達式 .....68

2.4.4 可變參類模板 .....69

2.5 多態在模板中的應用 .....82

2.6 模板的特殊繼承關系 .....85

2.6.1 奇異(奇特)的遞歸模板模式 .....85

2.6.2 混入 89

2.7 模板代碼的組織結構與模板的顯式實例化和聲明 .95

2.7.1 模板代碼的組織結構 .95

2.7.2 模板的顯式實例化、模板聲明、代碼組織結構 98

第3章 模板進階知識 ..102

3.1 萬能引用 ..102

3.1.1 類型區別的基本含義 .....102

3.1.2 基本認識 ...103

3.1.3 萬能引用資格的剝奪與辨認 .106

3.2 類型推斷 ..107

3.2.1 如何查看類型推斷結果 .107

3.2.2 理解函數模板類型推斷 .109

3.2.3 auto類型常規推斷 ..118

3.3 完美轉發 ..121

3.3.1 完美轉發的概念和步驟演繹 .121

3.3.2 std::forward 124

3.3.3 普通參數的完美轉發 .....126

3.3.4 在構造函數模板中使用完美轉發範例 .....127

3.3.5 在可變參數模板中使用完美轉發範例 .....130

3.3.6 完美轉發失敗的情形一例 ....132

3.4 std::enable_if的使用 ...133

3.4.1 一個簡單範例 ...133

3.4.2 替換失敗並不是一個錯誤(SFINAE) ...134

3.4.3 enable_if ....136

3.5 類模板中可變參的逐步展開 .....141

3.5.1 myclasst<Args...>繼承 ..141

3.5.2 myclasst<Args>...繼承 ..142

3.5.3 myclasst<Args,char>...繼承 .143

3.5.4 myclasst<Args,Args...>...繼承 ....143

第4章 標準庫的典型內容 .145

4.1 std::declval .....145

4.1.1 基本概念和常規範例 .....145

4.1.2 std::declval返回右值引用類型的原因 .....148

4.1.3 推導函數返回值範例 .....151

4.2 std::true_type和std::false_type .154

4.3 std::void_t 157

4.3.1 源碼分析和常規範例 .....157

4.3.2 編譯器如何選擇泛化版本和特化版本 .....161

4.3.3 借助void_t和declval實現is_copy_assignable ....162

4.3.4 綜合範例 ...164

4.4 std::conditional .....168

4.5 std::function的實現 .....170

4.5.1 標準庫中的std::function 170

4.5.2 實現類似std::function的功能 ....170

4.6 std::remove_all_extents 176

4.7 std::integer_sequence ...179

4.7.1 正向排列數字生成一個類型Integer_Sequence .....180

4.7.2 逆向排列數字生成一個類型Integer_Sequence_Reverse ....181

4.7.3 將一個數字重復多次生成一個類型Repeat_Integer .....183

4.8 std::is_union、std::is_class和std::integral_constant ..185

4.8.1 std::is_union .....185

4.8.2 std::is_class 185

4.8.3 std::integral_constant .....186

第5章 萃取技術與策略技術 ....188

5.1 萃取技術及固定萃取演示 ..188

5.1.1 一個常規範例 ...189

5.1.2 迭代器範例 192

5.1.3 通過容器(數組)類型萃取元素類型範例 .....196

5.1.4 引用類型的移除和增加 .199

5.1.5 const修飾符的移除 .203

5.1.6 退化技術 ...203

5.2 萃取技術中的值萃取演示 ..209

5.2.1 一個常規範例 ...209

5.2.2 判斷是否為void類型的範例214

5.2.3 判斷兩個類型是否相同 .215

5.3 使用SFINAE特性的信息萃取 .216

5.3.1 用成員函數重載實現is_default_constructible 216

5.3.2 用成員函數重載實現is_convertible ..219

5.3.3 用成員函數重載實現is_class .....221

5.3.4 用成員函數重載實現is_base_of .222

5.3.5 用類模板特化實現is_default_constructible ....225

5.4 將trait類模板用作模板參數 ....226

5.5 策略技術中的算法策略 228

5.5.1 常規範例:普通策略類 .228

5.5.2 常規範例:策略類模板 .230

5.5.3 萃取技術與策略技術的比較 .231

第6章 元編程 232

6.1 術語、元函數 .....232

6.1.1 術語 ....232

6.1.2 元函數 .233

6.2 混合元編程 ....243

6.2.1 常規的計算點積範例 .....243

6.2.2 混合元編程計算點積 .....245

6.3 typelist實現(類型計算範例) .254

6.3.1 設計和基本操作接口(算法) ...254

6.3.2 擴展操作接口(算法) .259

6.3.3 typelist的老式設計與typelist的思考 265

6.4 tuple實現 .271

6.4.1 重要基礎知識回顧 ..271

6.4.2 元組基本概念、基礎代碼的設計和實現 ..277

6.4.3 操作接口(算法) ..286

第7章 標準模板庫代碼 .....294

7.1 list容器的簡單實現 .....294

7.1.1 基礎代碼 ...295

7.1.2 插入新元素前的準備 .....297

7.1.3 插入新元素 300

7.1.4 釋放容器中元素所占用的內存 ...304

7.2 迭代器設計中的分類目的 ..305

7.2.1 迭代器的分類 ...305

7.2.2 迭代器分類目的詳述 .....307

7.3 一個典型算法—find_if的簡單實現 ...310