c++++的template是泛型編程的核心機制,它通過類型參數化實現代碼復用。1. 函數模板允許定義通用函數,如template
c++的template是泛型編程的核心機制之一,它允許我們編寫與數據類型無關的代碼。簡單來說,你可以用它來定義通用的函數或類,讓編譯器在使用時根據實際類型自動生成對應的代碼。
函數模板的基本定義和使用
最常見的是函數模板,比如寫一個通用的交換函數:
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
這里的關鍵字template表示這是一個模板,
立即學習“C++免費學習筆記(深入)”;
調用方式也很自然:
int x = 1, y = 2; swap(x, y);
編譯器會自動推導出T是int類型并生成對應版本的swap函數。
類模板的定義與實例化
除了函數,也可以用模板定義類。例如一個簡單的動態數組類:
template <typename T> class DynamicArray { public: DynamicArray(int size); ~DynamicArray(); void push_back(const T& value); // ... private: T* data; int capacity; };
使用的時候需要顯式指定類型:
DynamicArray<int> arr(10);
類模板不像函數模板那樣能自動推導類型,所以每次創建對象時都需要加上具體的類型參數。
模板參數可以有多個,也可以帶默認值
有時候你可能需要多個類型參數,或者給它們設置默認值。比如標準庫里的std::map就是這樣的例子:
template <typename Key, typename Value, typename Compare = std::less<Key>> class map { ... };
上面這段代碼里用了三個模板參數:
- Key 和 Value 是必須提供的類型
- Compare 有默認值std::less
,不傳也沒關系
這樣設計的好處是靈活又不至于每次都寫一堆參數。
注意一些容易忽略的細節
模板雖然強大,但也有幾個地方需要注意:
- 模板代碼必須放在頭文件中:因為模板不是真正的函數或類,而是“藍圖”,只有在被使用時才會生成具體代碼。
- 編譯錯誤信息通常比較難讀:一旦出錯,報錯信息可能會很長而且晦澀,這時候要仔細看提示的上下文。
- 不要濫用模板元編程:雖然可以用模板做很多高級技巧(比如編譯期計算),但如果只是為了通用性,保持簡潔更好。
基本上就這些。掌握好模板的使用,能讓你的C++代碼更靈活、復用性更高。