引言
在日常開發中,我們經常接觸 函數參數,這是控制函數行為的最直接方式。但在 C++ 中還有一種強大的機制 —— 模板參數(Template Parameters),它賦予了我們在編譯期就生成代碼結構的能力。
本文將通過直觀的類比,講清楚模板參數和函數參數的區別,并深入介紹模板參數的主要類型與用途。
一、類比理解:模板參數 ≠ 函數參數
我們先看一個常見誤解:
template<size_t V>
void foo() {std::array<int, V> arr; // V 決定數組大小
}
有些同學看到 會誤以為這是函數參數,其實不然:
對比維度 | 模板參數 | 函數參數 (int v) |
---|---|---|
位置 | 在尖括號 < > 中 | 在圓括號 ( ) 中 |
生命周期 | 編譯期 | 運行期 |
用途 | 控制代碼生成(如數組大小、選擇分支) | 控制函數邏輯/數據 |
可否參與模板實例化 | ? 是 | ? 否 |
是否可變 | ? 編譯期固定 | ? 可動態變化 |
📌 舉個例子更清楚:
// 模板參數:數組大小在編譯期就確定
template<size_t N>
void printArray(std::array<int, N> arr) {for (auto x : arr) std::cout << x << " ";
}
這個 N 就是模板參數。如果你改成函數參數,就會出錯:
// ? 錯誤示例:函數參數不能用于 std::array 定義
void printArray(int n, std::array<int, n> arr); // ? 錯誤,n不是編譯期常量
二、模板參數的主要類型和用途
模板參數在 C++ 中可以大致分為以下幾類,每一類都有對應的應用場景:
1?? 類型模板參數 typename T / class T
template <typename T>
T add(T a, T b) { return a + b; }
- 用于泛型類型,如 int, float, std::string 等。
- 被廣泛用于 STL 的容器與算法中。
2?? 非類型模板參數(編譯期常量)
template <int N>
std::array<int, N> makeArray() {return std::array<int, N>{};
}
- 可用于定義固定大小的數組、常量控制等。
- 類型包括:int, size_t, bool, 指針/引用常量等。
- 場景如:圖著色、滑動窗口大小、緩存塊大小、通道數量等。
三、何時使用模板參數?
🧩 你需要在編譯期決定結構尺寸或邏輯分支
🔧 你想要類型安全的泛型結構
🚀 你追求運行效率和零運行時開銷