C++模板的偏特化與全特化
阿新 • • 發佈:2019-05-07
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++模板的偏特化與全特化