01 函数模板基本语法的学习:
#includeusing namespace std; //函数模板 先声明一个泛型T template void mySwap(T& num1, T& num2) { T temp=num1; num1 = num2; num2 = temp; } void Test() { int a = 10; int b = 20; //1、自动类型推导 //mySwap(a, b); //2、直接提示数据类型 mySwap (a, b); cout << "a=" << a << " b=" << b << endl; } void main() { Test(); }
02 函数模板注意事项
#includeusing namespace std; //函数模板 先声明一个泛型T template void _01mySwap(T& num1, T& num2) { T temp = num1; num1 = num2; num2 = temp; } //1、自动类型推导 必须推导出一致的数据类型T才可以使用 void _02Test01() { int a = 10; int b = 20; char c = 'c'; //_01mySwap (a, c);//报错 因为不能推导出T究竟是哪一个数据类型 _01mySwap(a, b);//正确 cout << "a=" << a << " b=" << b << endl; } //2、模板必须要确定出T的数据类型,才可以使用 template void func() { cout << "func 的调用" << endl; } void _02Test02() { //func();//报错 没有确定的T的类型 func ();//正确 } void main() { _02Test01(); _02Test02(); }
03 函数模板案例-数组排序
#includeusing namespace std; //实现通用 对数组进行排序的函数 //规则 从大到小 //算法 选择排序 //测试char数组、int数组 //排序算法 template void mySort(T array[],int len) { int min; for (int i = 0; i < len; i++) { min = i; for (int j = i + 1; j < len; j++) { if (array[min] > array[j]) { min = j; } } if (min != i) { T temp; temp = array[min]; array[min] = array[i]; array[i] = temp; } } } //打印输出 template void myPrint(T array[], int len) { cout << "长度:" < 04 普通函数与函数模板的区别
#includeusing namespace std; //普通函数与函数模板的区别 //1、普通函数调用可以发生隐式类型转换 //2、函数模板 用自动类型推到,不可以发生隐式类型转换 //3、函数模板 用显示指定类型,可以发生隐式类型转换 //普通函数 int myAdd01(int a, int b) { return a + b; } //函数模板 template T myAdd02(T a, T b) { return a + b; } void _04Test01() { int a = 10; char c = 'c'; cout << myAdd01(a, c) << endl;;//不报错 自动将char 类型转换为int 类型 //cout < (a, c) << endl;//不报错 显示指定类型可以进行自动类型转换 } void main() { _04Test01(); } 05 普通函数与函数模板调用规则
//1、如果函数模板与普通函数都可以调用,优先调用普通函数
//2、可以通过空模板参数列表 强制调用 函数模板
//3、函数模板可以发生函数重载
//4、如果函数模板可以产生更好的匹配,优先调用函数模板#includeusing namespace std; //普通函数与函数模板调用规则 //1、如果函数模板与普通函数都可以调用,优先调用普通函数 //2、可以通过空模板参数列表 强制调用 函数模板 //3、函数模板可以发生函数重载 //4、如果函数模板可以产生更好的匹配,优先调用函数模板 void myShow(int a, int b) { cout << "调用普通函数" << endl; } template void myShow(T a, T b) { cout << "调用函数模板" << endl; } template void myShow(T a, T b,T c) { cout << "调用函数重载模板" << endl; } void _05Test01() { int a = 10; int b = 20; //1、如果函数模板与普通函数都可以调用,优先调用普通函数 myShow(a, b); //2、可以通过空模板参数列表 强制调用 函数模板 myShow<>(a, b); //3、函数模板可以发生函数重载 int c = 30; myShow(a, b, c); //4、如果函数模板可以产生更好的匹配,优先调用函数模板 char c1 = 'a'; char c2 = 'b'; myShow(c1, c2); } void main() { _05Test01(); } 06 函数模板的局限性
#include#include using namespace std; //模板的局限性 //模板并不是万能的,有些特定数据类型,需要用具体化方式做特殊实现 //如对自定义的数据类型进行对比 则函数模板不能进行操作 class Person { public: string m_Name; int m_Age; public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } }; template void Compare(T &t1, T &t2) { if (t1 == t2) { cout << "两数据相等" << endl; } else { cout << "两数据不相等" << endl; } } //利用具体化的Person的版本实现代码,具体化优先调用 其实就是相当于指定类型进行重载 template<> void Compare(Person& p1, Person& p2) { if (p1.m_Age == p2.m_Age && p1.m_Name == p2.m_Name) { cout << "两数据相等" << endl; } else { cout << "两数据不相等" << endl; } } void _06Test01() { Person p1 ("Tom", 10 ); Person p2 ("Tom",10 ); Compare(p1, p2); } void main() { _06Test01();//报错 }



