c++++模板通過template關鍵字和類型參數(shù)實現(xiàn)泛型編程。template是定義模板的關鍵字,用于聲明函數(shù)或類模板,其中t為類型占位符,調用時被具體類型替換。1. 類型參數(shù)可用于函數(shù)參數(shù)、變量聲明、返回值等位置,如add函數(shù)中使用t作為通用類型;2. 模板可含多個類型參數(shù),如t1和t2分別代表不同類型;3. 除類型參數(shù)外,還可使用非類型參數(shù);4. 類模板結構類似函數(shù)模板,如myvector類通過t實現(xiàn)通用容器功能;5. 使用顯式實例化分離定義與實現(xiàn);6. 可設置默認類型參數(shù)簡化使用;7. 模板特化允許為特定類型提供專屬實現(xiàn)。這些特性使模板成為c++泛型編程的核心工具。
C++模板的基本語法主要圍繞 template 關鍵字和類型參數(shù)的使用展開,它允許我們編寫與類型無關的代碼,實現(xiàn)泛型編程。
什么是 template 關鍵字?
在 C++ 中,template 是用于定義模板的關鍵字。它告訴編譯器接下來的類或函數(shù)是一個模板,而不是一個具體的類型或函數(shù)。基本格式如下:
template <typename T> // 或者 template <class T>,兩者幾乎等價
這里的 T 是一個類型參數(shù)(type parameter),它只是一個占位符,在使用時會被替換成實際的類型(比如 int、String 等)。
立即學習“C++免費學習筆記(深入)”;
舉個例子,一個簡單的模板函數(shù):
template <typename T> void print(T value) { std::cout << value << std::endl; }
調用的時候:
print<int>(10); // 輸出整數(shù) print<std::string>("Hello"); // 輸出字符串
這樣就可以用一套邏輯處理多種數(shù)據(jù)類型。
類型參數(shù)怎么用?
模板中的類型參數(shù)可以出現(xiàn)在多個地方:函數(shù)參數(shù)、變量聲明、返回值等。它們的作用是作為“通用類型”來替代具體類型。
例如,寫一個通用的加法函數(shù):
template <typename T> T add(T a, T b) { return a + b; }
這個函數(shù)適用于所有支持 + 運算的數(shù)據(jù)類型,比如 int、double、甚至自定義的類(如果重載了運算符的話)。
有幾個關鍵點需要注意:
- 類型參數(shù)名(如 T)只是占位符,可以換成任何合法標識符,比如 Type、Elem 等。
- 同一個模板中可以有多個類型參數(shù),比如:
template <typename T1, typename T2> void foo(T1 a, T2 b);
- 模板參數(shù)也可以是普通類型參數(shù)之外的東西,比如非類型參數(shù)(后面再講)。
模板類的基本結構
除了函數(shù)模板,還有類模板。類模板的語法也很類似:
template <typename T> class MyVector { public: void push(T value); T get(int index); private: T* data; int size; };
使用方式是:
MyVector<int> vec; vec.push(10);
這里
類模板的一個常見用途是實現(xiàn)像 STL 中的 std::vector
實際使用中的一些細節(jié)
- 顯式實例化:有時候我們會看到這樣的寫法 template class MyVector
;,這叫顯式實例化,通常用于分離模板定義和實現(xiàn)(避免頭文件中必須包含實現(xiàn)代碼)。 - 默認類型參數(shù):可以給模板參數(shù)設置默認值,比如:
template <typename T = int> class Box { ... };
使用時如果不指定類型,默認就是 int。
- 模板的特化:有時候我們需要為某些特定類型提供不同的實現(xiàn),這就是模板特化(specialization)。
比如:
template <> class Box<char*> { // 特別的實現(xiàn) };
基本上就這些。模板是 C++ 強大但略復雜的特性之一,理解好 template 和類型參數(shù)的使用是掌握它的第一步。