1. 程式人生 > >C++模板的偏特化與全特化

C++模板的偏特化與全特化

str emp ble 定義 col effective ron 導出 列表

模板的聲明

類模板和函數模板的聲明方式是一樣的,在類定義/模板定義之前聲明模板參數列表。例如:

// 類模板
template <class T1, class T2>
class A{
    T1 data1;
    T2 data2;
};

// 函數模板
template <class T>
T max(const T lhs, const T rhs){   
    return lhs > rhs ? lhs : rhs;
}

全特化

通過全特化一個模板,可以對一個特定參數集合自定義當前模板,類模板和函數模板都可以全特化。 全特化的模板參數列表應當是空的,並且應當給出”模板實參”列表:

// 全特化類模板
template <>
class A<int, double>{
    int data1;
    double data2;
};

// 函數模板
template <>
int max(const int lhs, const int rhs){   
    return lhs > rhs ? lhs : rhs;
}

註意類模板的全特化時在類名後給出了”模板實參”,但函數模板的函數名後沒有給出”模板實參”。 這是因為編譯器根據int max(const int, const int)

的函數簽名可以推導出來它是T max(const T, const T)的特化。

偏特化

類似於全特化,偏特化也是為了給自定義一個參數集合的模板,但偏特化後的模板需要進一步的實例化才能形成確定的簽名。 值得註意的是函數模板不允許偏特化,這一點在Effective C++: Item 25中有更詳細的討論。 偏特化也是以template來聲明的,需要給出剩余的”模板形參”和必要的”模板實參”。例如:

template <class T2>
class A<int, T2>{
    ...
};

函數模板是不允許偏特化的,下面的聲明會編譯錯:

template <class T1, class T2>
void f(){}

template <class T2>
void f<int, T2>(){}

C++模板的偏特化與全特化