1. 程式人生 > >c++--模板與泛型編程

c++--模板與泛型編程

編譯 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++--模板與泛型編程