chap1 C++泛型技術基礎--模板 #STL

0 緣起

  • 有一點編程經驗和積累,想系統的學習下STL,之前都是隨意作的筆記,如今想着成主題的輸出一下。html

  • 書的原型是ISBN:9787302421757 《C++泛型STL原理和應用》,是從圖書館借的國內大學教材,先把這個讀完了,若是有可能的話,就在相應的章節再寫一個plus版本。git

1 內容

1.1 泛型和模板

1.1.1 泛型的概念

  • 泛型(generic type):就是一種通用類型。算法

  • T max( T x, T y) {} //這裏T是類型佔位符編程

1.1.2 C++模板及其定義

  • 模板:除了須要聲明類型佔位符以外,其它內容應與目標實體代碼徹底相同。 聲明一個模板時,需在實體代碼前面,加一條說明語句。前面是template關鍵字。函數

    • 函數模板學習

      • template<typename T, typename R, typename S> T max(R x, S y){}.net

    • 類模板指針

      • 在聲明語句前加 template<typename T>code

1.1.3 幾點說明和小結

  • template<typename T> 早期也寫成 template<class T>,但不支持這麼寫htm

  • C++11和14中,給關鍵字 auto 增長了新的語義,同時增長了 decltype表達式

    • auto關鍵字是爲自動推導數據類型所設 auto i=100;

    • 以前auto只對系統的內置數據推薦有效,如今利用編譯器的類型記憶能力,能夠記住自定義的類型。

    • 變量類型難以肯定的問題主要出如今函數的返回值上,所以函數的返回值類型的位置經常會出現auto關鍵字,稱爲 auto返回值佔位

    • auto Multiply(T t, U u)->decltype(t*u) {return t*u;}

  • 把auto看作數據類型的話,auto其實也能夠算一種泛型,不過它無須關鍵字typename聲明。

  • C++新標準引入了變量模板的概念。pi<T> 【做者沒有介紹更多,能夠翻看C++11】

1.2 關於模板參數

1.2.1 模板參數的種類

  • 類型參數

    • 以類模板做爲函數實參的例子 MyTest<Test1<int>>TT;

  • 非類型參數

    • template <typename T,/*類型參數*/ int b/*非類型參數*/>

  • 模板定義型參數

    • C++也容許以類模板的定義做爲類模板參數

      • 須要的目的: 除了強調這個參數的實參必須爲類模板以外,還強調這個類模板所具備的參數個數。

1.2.2 模板形參和實參的結合

  • 函數模板實參的隱式提供

    • add<int>(45,46); 直接變成 add(45,46);

  • 指針實參

    • 在C++中,指針被看做一種數據類型。

    • 見具體的代碼; 【做者沒有描述,我還沒太懂這部分

  • 修飾字const和&的使用

    • 見具體的代碼示例; 【沒見過具體的應用場景

1.3 特化模板和模板具現規則

1.3.1 特化(特列化)模板

  • 特化(特列化)模板:爲有特殊算法要求的數據類型另行編寫模板

    • 通用模板:門票10塊

    • 特化模板:學生和老人半價

  • 函數模板中的特化模板

    • 在實體代碼前加如下聲明 tmplate<>

  • 類模板的特化和偏特化

    • 偏特化:只特化參數中的某一個或某幾個

    • 偏特化模板的寫法 template<typename T2> struct Test<int,T2>{}

    • 全特化模板的寫法 template<> struct Test<int,float>{}

1.3.2 模板的具現

  • 由於有了以上泛型模塊的共存,編譯器就須要選擇一個生成實體模塊代碼,就有了規則。

  • 具體的優先順序

    • 特化模板(函數或類)

    • 偏特化模板(函數或類)

    • 普通模板(函數或類)

    • 系統

1.4 右值引用和模板

  • 轉移語義是C11推出的新概念和新技術。

1.4.1 右值引用

  • 右值: 只能出如今賦值運算符右邊。僅能表明數據;匿名,無固定地址的對象。

  • 左值: 既能夠出如今賦值運算符左邊,又能夠出如今賦值運算符右邊。有名字,有固定地址的表達式

  • 右值引用

    • C11以前有兩種表示方式 T& 別名 = lvalue;//引用const T& 別名 = lvalue;//常引用

    • C11以後僅定義一種:const T& 別名 = rvalue;

      • 強行爲右值命名一個變量名,目的就是爲延長右值生命期。

      • 右值的很是量引用 T&& 名稱=rvalue;

1.4.2 右值引用的應用1--轉移語義

  • 深拷貝

  • 淺拷貝

1.4.3 右值引用的應用2--轉移函數move()

  • 右值引用有好處後,左值也想利用,move的原型 T&& move(T& val);

1.4.4 右值引用的應用3--參數完美轉發模板()

  • 參數轉發

  • 1 完美轉發問題的提出及解決思路

  • 2 模板參數類型推導規則--引用符摺疊規則

  • 3 參數類型正確轉發的保證--forward()函數模板

    • static_cast():這個轉換隻對參數爲右值時有用。

    • C++11將static_cast()封裝成函數模板std::forward,因而Func(forwad<T>(a));

本章代碼

別的教材相應章節

  • 《C++STL開發技術導引》 chap2 C++模板技術 P39/454

    • 內容

      • 2.4 函數模板重載 P44 編譯器調用規則

      • 2.5 類模板繼承 P44

      • 代碼到時再一塊兒提交。

    • 問題

      • 模板和宏是什麼關係?【lionel]

閱讀版本與遇到的問題

  • 2017-01-14兩個番茄鍾:1.1節理解並代碼完成,1.2節剛開始看

    • C++新標準引入了變量模板的概念。pi<T> 【做者沒有介紹更多,能夠翻看C++11】

    • 以類模板做爲函數實參的例子,簡單的能看懂,但到真實應用場景中,目前還真說很差。

  • 2017-01-15兩個番茄鍾:1.2和1.3節理解並代碼完成

    • 目前這些只是知道了,還沒徹底記住,更不清楚應用場景。

  • 2017-01-16兩個番茄鍾:1.4結束

    • 這部分只是按課本看了,並無徹底消化掉,須要再回來看看。

    • 是否是得結合C++11來一塊兒翻看?【lionel】

  • 2017-01-17 看了下《C++STL開發技術導引》中的chap2

相關文章
相關標籤/搜索