模板

  模板函数  调用的时候需要传递类型进去(显示调用)

如果根据传入的参数 可以确定是什么类型 那么就可以省略传入类型(隐性调用)

函数模板 根据传入的类型 去生成一个适合的模板函数

一个函数的调用优先调用普通函数 其次模板函数 最后强转匹配普通函数

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 }

 

posted @ 2019-08-23 07:55  insist钢  阅读(217)  评论(0编辑  收藏  举报