模板
模板函数 调用的时候需要传递类型进去(显示调用)
如果根据传入的参数 可以确定是什么类型 那么就可以省略传入类型(隐性调用)
函数模板 根据传入的类型 去生成一个适合的模板函数
一个函数的调用优先调用普通函数 其次模板函数 最后强转匹配普通函数
template是关键字后面加<>
类模板 根据传入类型 对应模板类 定义对象 定义对象格式 必须使用显示指明类型
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct A 5 { 6 int data; 7 }; 8 template<class T>//模板T 也可以写其他字母 T是未确定类型的 可以传任意类型的 根据赋值确定调用 比较灵活 9 void bulletSort(T arr[], int size)//冒泡排序 10 { 11 T temp; 12 for (int i = 0; i < size-1; i++) 13 { 14 for (int j = 0; j < size-1-i; j++) 15 { 16 if (arr[j+1]>arr[j]) 17 { 18 temp = arr[j + 1]; 19 arr[j + 1] = arr[j]; 20 arr[j] = temp; 21 } 22 23 } 24 25 } 26 } 27 template<class T> 28 void fin(T a, T b) 29 { 30 cout << "调用一个函数1" << endl; 31 cout << a << b << endl;//避免传入不可打印类型 32 } 33 template<class T1,class T2> 34 void fun(T1 a, T2 b)//这里可以传两个 不同类型的参数 35 { 36 37 } 38 void fun(int a, int b) 39 { 40 cout << "调用函数2" << endl; 41 } 42 int main() 43 { 44 int arr[10]; 45 float brr[20] = { 1.9f, 2.3f, 33.0f, 201.2f }; 46 bulletSort<float>(brr, 20);//调用函数的时候传入T的类型 47 bulletSort(brr, 20);//根据函数的参数让T自动推导出函数的类型 48 /* 49 fun<int>(3,4);定义T的类型 传入相关类型的参数 50 当T作为参数的时候定义了两个类型 51 如果这两个类型不同的化 必须指明T的类型 没法自动推导 52 fun<double>(3.0,4); 53 54 55 56 */ 57 //A a, b; 58 //fun(a, b); 59 fun(3, 4);//优先调用普通函数 再去调用模板函数 最后再去查看强转匹配普通函数 60 fun(3.0, 4.0); 61 //根据类型 去生成一个合适的模板对象 62 for (auto s : brr) //遍历整个数组 63 { 64 cout << s << ' '; 65 } 66 vector<int> vec;//定义对象格式必须显式指明类型 67 //迭代器 理解成指针 68 cin.get(); 69 return 0; 70 71 }