C++模板
分類
C++的模板分為函數模板和類模板。
函數模板:
template<typename T>
T myAdd(T a, T b) {
return a + b;
}
類模板:
template <typename T>
class A {
...
}
注意:結構體做成的模板也是類模板;C++中類和結構體的唯一區別就是默認訪問權限是private還是public。
主模板和特化
主模板相當于基類,特化相當于對基類的派生;
特化分為全特化(實例化模板的某個具體類型,比如int,float)和偏特化(實例化模板的一類類型,比如指針T*,const T)。
舉例說明,主模板:
template <typename T>
class A {
... // 默認實現,可以和T無關,一般情況也T無關
}
全特化 —— 針對int類型:
template <>
class A<int> {
...
}
比如:為bool類型優化打印
#include <iostream>
template<typename T>
struct Printer {
void print(T value) {
std::cout << "General: " << value << std::endl;
}
};
// 全特化:為 bool 類型提供更友好的輸出
template<>
struct Printer<bool> {
void print(bool value) {
std::cout << "Boolean: " << (value ? "true" : "false") << std::endl;
}
};
int main() {
Printer<int> p1;
p1.print(42); // 輸出: General: 42
Printer<bool> p2;
p2.print(true); // 輸出: Boolean: true
}
偏特化 —— 針對指針:
template <typename T>
class A<T*> {
...
}
比如:
#include <iostream>
// 主模板:默認不是指針
template<typename T>
struct is_pointer {
static constexpr bool value = false;
};
// 偏特化:當 T 是某種類型的指針時
template<typename T>
struct is_pointer<T*> {
static constexpr bool value = true;
};
int main() {
std::cout << is_pointer<int>::value << std::endl; // 0 (false)
std::cout << is_pointer<int*>::value << std::endl; // 1 (true)
std::cout << is_pointer<double*>::value << std::endl; // 1 (true)
}
有幾點需要注意:
- template<>為主模板全特化的標志,而class A<T*>為主模板偏特化標志;它們格式固定,不會在普通模板中出現
- 調用的時候,如果沒有匹配到任何類型,就會使用主模板的默認定義 —— 這點和基類派生類一致
- 全特化指的是特定的一個類型,比如int,float;偏特化反而指的是一類類型,比如指針,const;不要理解錯了
適用場景
普通模板要處理的場景為:只有類型不同,實現完全相同的場景;
主模板和全特化要處理的場景是:不同類型的內部實現均不相同,具體到單個類型;
主模板和偏特化要處理的場景是:不同類型的內部實現均不相同,具體到一類類型。
本文來自博客園,作者:moonのsun,轉載請注明原文鏈接:http://www.rzrgm.cn/moon-sun-blog/p/19152159

浙公網安備 33010602011771號