函数模板是为了对类型进行一个参数化。
1.函数模板声明
此时只是声明 还没确定类型 不进行编译
template<class T> // 定义一个模板参数列表 bool compare(T a, T b) // compare是一个函数模板 { cout << "Template compare" << endl; return a > b; }
2.在函数的调用点处模板实例化
在函数调用点进行实例化
int main() { //函数的调用点 compare<int>(10, 20); compare<double>(10.2, 20.2); return 0; }
3.模板函数 是被编译器编译的
从调用点走出来后是会从原模版实例化出来一份函数代码的 -》模板函数
bool compare<int>(int a, int b) { cout << "Template compare" << endl; return a > b; } bool compare<double>(double a, double b) { cout << "Template compare" << endl; return a > b; }
模板的特例化
//针对compare函数模板,提供const char*类型的特例化版本 template<> bool compare<const char*>(const char* a, const char* b) { cout << "compare<const char*>" << endl; return strcmp(a, b) > 0; } bool compare(const char* a, const char* b) { cout << "normal compare" << endl; return strcmp(a, b) > 0; }
int main() { //针对compare函数模板,提供const char*类型的特例化版本 template<> bool compare<const char*>(const char* a, const char* b) { cout << "compare<const char*>" << endl; return strcmp(a, b) > 0; } bool compare(const char* a, const char* b) { cout << "normal compare" << endl; return strcmp(a, b) > 0; } }
模板的非类型参数
模板类型参数
模板非类型参数 必须是整数类型(整数或者地址/引用都可以)都是常量 只能使用 不能修改template<class T, int SIZE> void sort(T* arr) { for (int i = 0; i < SIZE - 1; ++i) { for (int j = 0; j < SIZE - 1 - i; ++j) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { int arr[] = { 12,5,7,89,32,21,35 }; const int size = sizeof(arr) / sizeof(arr[0]); sort<int, size>(arr); for (int val : arr) { cout << val << " "; } cout << endl; }