
- C++ 基礎
- C++ 首頁
- C++ 概述
- C++ 環境設定
- C++ 基本語法
- C++ 註釋
- C++ Hello World
- C++ 省略名稱空間
- C++ 常量/字面量
- C++ 關鍵字
- C++ 識別符號
- C++ 資料型別
- C++ 數值資料型別
- C++ 字元資料型別
- C++ 布林資料型別
- C++ 變數型別
- C++ 變數作用域
- C++ 多個變數
- C++ 基本輸入/輸出
- C++ 修飾符型別
- C++ 儲存類
- C++ 運算子
- C++ 數字
- C++ 列舉
- C++ 引用
- C++ 日期和時間
- C++ 控制語句
- C++ 決策
- C++ if 語句
- C++ if else 語句
- C++ 巢狀 if 語句
- C++ switch 語句
- C++ 巢狀 switch 語句
- C++ 迴圈型別
- C++ while 迴圈
- C++ for 迴圈
- C++ do while 迴圈
- C++ foreach 迴圈
- C++ 巢狀迴圈
- C++ break 語句
- C++ continue 語句
- C++ goto 語句
- C++ 建構函式
- C++ 建構函式和解構函式
- C++ 複製建構函式
C++ 模板
模板是泛型程式設計的基礎,泛型程式設計是一種允許編寫適用於不同資料型別的函式、類、演算法和不同程式碼片段的程式設計風格。
模板是建立泛型類或函式的藍圖或公式。庫容器(如迭代器和演算法)是泛型程式設計的示例,並且是使用模板概念開發的。
每個容器(例如 vector)只有一個定義,但我們可以定義許多不同型別的 vector,例如 vector<int> 或 vector<string>。用於定義模板的兩個關鍵字是 template 和 typename。
函式模板
函式模板定義了函式的藍圖,使函式能夠在不同的資料型別上操作,而無需重寫相同的邏輯。
語法
此處顯示了模板函式定義的一般形式的語法:
template <typename identifier> function_declaration;
此處,“template”關鍵字宣告泛型函式,“typename”關鍵字指定要用於引數的型別。
示例
以下是一個函式模板的示例,它返回兩個值的較大值。
#include <iostream> #include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }
輸出
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World
類模板
類似地,類模板也定義了建立可用於任何資料型別的類的藍圖。
語法
template <class type> class class-name { . . . }
此處,type 是佔位符型別名稱,將在例項化類時指定。您可以透過使用逗號分隔的列表來定義多個泛型資料型別。
示例
以下是定義類 Stack<> 並實現泛型方法以將元素推入和彈出堆疊的示例:
#include <iostream> #include <vector> #include <cstdlib> #include <string> #include <stdexcept> using namespace std; template <class T> class Stack { private: vector<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return true if empty. return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // append copy of passed element elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } // remove last element elems.pop_back(); } template <class T> T Stack<T>::top () const { if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); } // return copy of last element return elems.back(); } int main() { try { Stack<int> intStack; // stack of ints Stack<string> stringStack; // stack of strings // manipulate int stack intStack.push(7); cout << intStack.top() <<endl; // manipulate string stack stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1; } }
輸出
7 hello Exception: Stack<>::pop(): empty stack
模板引數推導
模板引數推導是一項功能,它會自動推導(理解)傳遞給函式或類模板的引數的資料型別。編譯器會為您推匯出它們,而不是顯式指定模板引數。
示例
讓我們看看模板引數推導的示例:
template<typename T> T add(T a, T b) { return a + b; } int main() { // The compiler deduces T as int auto result1 = add(5, 3); // The compiler deduces T as double auto result2 = add(3.14, 2.86); }
在此程式碼中,我們沒有編寫 add<int>(5,3) 或 add<double>(3.14, 2.86)。編譯器會根據您提供的引數推匯出型別。
函式模板引數推導
在 C++ 中,函式模板引數是一項功能,它允許編譯器根據傳遞給函式的引數自動推匯出模板引數的型別。
示例
這是一個函式模板引數推導的簡單示例。
#include <iostream> // Function template template<typename T> void printValue(T value) { std::cout << value << std::endl; } int main() { // Usage examples printValue(42); // T is int printValue("Hello"); // T is const char* printValue(3.14159); // T is double return 0; }
輸出
42 Hello 3.14159
類模板引數推導
C++ 中的類模板引數推導是一項功能,它使編譯器能夠在建立物件時從建構函式引數自動推斷類模板的模板引數。
示例
這是一個類模板推導的基本實現。
#include <iostream> template<typename T> class Holder { public: Holder(T value) : data(value) {} void show() const { std::cout << data << std::endl; } private: T data; }; int main() { Holder h1(42); // T deduced as int Holder h2(3.14); // T deduced as double Holder h3("Hello"); // T deduced as const char* h1.show(); // Output: 42 h2.show(); // Output: 3.14 h3.show(); // Output: Hello return 0; }
輸出
42 3.14 Hello
C++ 模板的優點
- 程式碼可重用性 - 模板使您能夠編寫適用於所有資料型別的通用程式碼,從而無需為每個所需的型別編寫相同的程式碼。這透過減少程式碼重複來節省開發時間。
- 減少維護 - 更新模板並檢視所有例項中的更改。在錯誤修復方面,修復一個錯誤並檢視所有例項帶來的好處,哪個更適用。
- 增強效能 - 模板例項化發生在編譯時,減少了執行時錯誤。編譯器會針對特定資料型別最佳化程式碼。
- 更好地組織程式碼 - 由於模板將演算法邏輯與資料型別分開,因此有助於建立模組化程式碼,這在開發場景中更有利。它有助於減少搜尋不同程式碼實現的次數。