c++--模板與泛型編程
阿新 • • 發佈:2017-05-20
編譯 string std size_t har rom 數組大小 傳遞 成員函數
函數體中的條件判斷僅使用<比較運算;
一、定義模板
1.1 函數模板
1. 適用情況:如果兩個函數幾乎是相同的,唯一的差異是參數的類型,函數體則完全一樣。
2. 定義
template <模板參數列表(以逗號分隔)>
1 template <typename T> 2 int compare(const T&v1,const T&v2) 3 { 4 if (v1<v2) return -1; 5 if (v2<v1) return 1; 6 }
3. 實例化函數模板
當調用一個函數模板時,編譯器用函數實參推斷實參。
4. 模板參數類型
類型參數T的用途:指定返回類型,指定函數參數類型,在函數體內用於變量聲明,變量類型轉換
5. 非類型模板參數
一個非類型參數表示一個值而非一個類型。當一個模板被實例化時,非類型參數被一個用戶提供的或編譯器推斷出的值所代替,這些值必須是常量表達式。
用途:在模板定義內,模板非類型參數是一個常量值。在需要常量表達式的地方,可以使用非類型參數,例如,指定數組大小。
//編寫一個conpare版本處理字符串字面常量。 //由於不能拷貝一個數組,所以我們將參數定義為數組的引用 template <unsigned N,unsigned M> int compare(const char (&p1)[N],const char (&p2)[M]) {return strcmp(p1,p2); } //調用compare compare("hi","mom"); //編譯器在字符串字面常量末尾插入一個空字符作為終結符,因此編譯器實例化出如下版本 int compare(const char (&p1)[3],const char (&p2)[4])
6. inline和constexpr的函數模板
template <typename T> inline T min(const T&,const T&) //註意inline位置
7. 編碼原則
compare函數編寫泛型代碼的原則:模板中的參數是const 的引用;
一個原則:模板程序應該盡量減少對實參類型的要求。
8. 模板編譯
註意:
1)只有當我們實例化出模板的一個特定版本時,編譯器才會生成代碼。
2)函數模板和類模板成員函數的定義通常放在頭文件中。
3)大多數編譯錯誤發生在實例化期間報告。保證傳遞給模板的實參支持模板所要求的的操作,以及這些操作能正確工作,是調用者的責任。
二、類模板
與函數模板不同之處是,編譯器不能為類模板推斷參數類型。為了使用類模板,必須在模板名後的< >中提供額外信息。
1. 用途:與類不同,模板可以用於更多類型的元素。
2. 定義
template <typename T> class Blob { public: typedef T value_type; typedef typename std::vector<T>::size_type size_type; Blob(); T& back(); T& operator[](size_type i); private: std::shared_ptr<std::vector<T>> data; void check(size_type i,const std::string &msg) const;
c++--模板與泛型編程