C++ primer 第五版個人筆記 第十六章 模板與泛型編程

16.1 定義模板

  1. 模板定義以關鍵字template開始,後跟一個模板參數列表,以逗號分隔,可以傳一個或多個模板參數(T1,T2),模板參數列表不能爲空;
  2. 編譯器用推斷出的模板參數來生成一個版本的函數叫做實例化,生成的版本叫做模板的實例;
  3. 模板類型參數前面必須使用關鍵字class或typename,在同一個模板參數列表中兩個關鍵字可以混合使用,沒有什麼不同;
  4. 非類型模板參數的模板實參必須是常量表達式;
  5. inline或constexpr的函數模板中,inline和constexpr關鍵字說明符放在模板參數列表之後,返回類型之前
    template<typename T> inline
    T min(const T& t1, const T &T2)
    {/* */}

     

  6. 泛型編碼的兩個重要原則:a模板中的函數參數是const的引用,b函數體中儘量減少對實參類型的要求;

  7.  函數模板和類模板成員函數的定義通常放在頭文件中;而非模板類或模板函數不必給出定義,因此類定義和函數聲明放在頭文件中,普通函數和類的成員函數的定義放在源文件中,與函數模板和類模板成員函數不同; 

  8. 類模板的成員函數本身是一個普通函數,但是,類模板的每個實例都有其自己版本的成員函數,因此定義在類模板之外的成員函數就必須以關鍵字template開始,後接類模板參數列表;

  9. 默認情況下,對於一個實例化了的類模板,其成員只有在使用時才被實例化;

  10. 在一個類模板的作用域內(即在類模板內)定義成員函數可以直接使用模板名而不必指定模板實參,但在類模板外定義成員函數,除了用作用域運算符::指定類外還要指定其模板實參;

  11. 一對一友好關係的聲明方法,詳見589頁,爲了讓所有實例成爲友元,友元聲明中必須使用與類模板本身不同的模板參數;

  12. 一個static成員函數只有在使用時纔會實例化;

  13. 當我們希望通知編譯器一個名字表示類型時,必須使用關鍵字typename,而不能使用class;

  14. 當我們在類模板外定義一個成員模板時,必須同時爲類模板和成員模板提供模板參數列表,類模板的參數列表在前,後跟成員自己的模板參數列表;

16.2 模板實參推斷

  1. 將實參傳遞給帶模板類型的函數形參時,能夠自動應用的類型轉換隻有const轉換及數組或函數到指針的轉換;
    template<typename T> T fobj(T,T);
    template<typename T> T fref(const T&, const T&);
    
    int a[10], b[42];
    fobj(a,b) //可行,調用 fobj(int*,int*)
    fref(a,b) //不可行,形參爲引用時,數組不會轉換爲指針,因此a,b類型不匹配
    //實際上調用的是fref(const int(&a)[10], const int(&b)[42])

     

  2. 如果函數參數類型不是模板參數,則對實參進行正常的類型轉換;

  3. 顯示指定模板實參

    template<typename t1, typename t2, typename t3>
    t3 alternative_sum(t2,t1)   //聲明OK,但是實例化就必須爲三個模板參數指定實參
    
    auto val3 = alternative<long long> (i, lng) //錯誤,t1爲long long類型,另外兩個無法推測

    正常類型轉換可以應用於顯式指定的實參,詳見604頁;

  4. 尾置返回類型處理某些模板返回值類型的確定問題

    template <typename It>    //It爲某容器迭代器類型,要求返回容器內類的引用
    auto &fcn(It beg, It end) ->decltype (*beg)    //尾置返回類型聲明方法
    {
        return *beg;                        
    }

     

  5. 進行類型轉換的標準庫模板類,用法列表(包含remove_reference, add_const等),606頁;

  6.  引用摺疊只能應用於間接創建的引用的引用,如類型別名或模板參數,有一下摺疊方式

    X& &, X& && , X&& &都摺疊成類型X& //第一個是引用的引用,第二個是右值引用的引用,第三個是引用的右值引用
    X&& &&摺疊成 X&&  //右值引用的右值引用摺疊成右值引用

      

16.3 重載與模板

過於抽象,學一段時間再回來補課

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