大家好,欢迎来到IT知识分享网。
大家好:
衷心希望各位点赞。
您的问题请留在评论区,我会及时回答。
一、函数模板
C++另一种编程思想为:泛型编程,主要利用的技术就是模板。
C++提供两种模板机制:函数模板、类模板
函数模板语法
函数模板作用:建立一个通用函数,它的函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表。
语法:
template<typename T>
函数声明或定义
解释:
template:声明创建模板
typename:表示其后面的符号是一种数据类型,可以用class代替
T:通用的数据类型,名称可以替换,通常为大写字母
#include <iostream> #include <Windows.h> #include <string> using namespace std; // 交换两个数 template<typename T> void mySwap(T& a, T& b) { T temp = a; a = b; b = temp; } int main(void) { int a = 10; int b = 20; // 有两种调用方式 // 1、自动类型推导 mySwap(a, b); cout << "a = " << a << endl; cout << "b = " << b << endl; double c = 1.1; double d = 2.2; // 2、显示指定类型 mySwap<double>(c, d); cout << "c = " << c << endl; cout << "d = " << d << endl; system("pause"); return 0; }
运行截图:
总结
函数模板利用关键字template
使用函数模板有两种方式:自动类型推导、显式指定类型
模板的目的是为了提高复用性,将类型参数化。
二、函数模板注意事项
注意事项:
1.自动类型推导,必须推导出一致的数据类型T,才可以使用。
2.模板必须要确定出T的数据类型,才可以使用。
#include <iostream> #include <Windows.h> #include <string> using namespace std; // 利用模板提供通用的交换函数 template<typename T> void mySwap(T& a, T& b) { T temp = a; a = b; b = temp; } int main(void) { int a = 10; int b = 20; char c = 'c'; // 函数模板注意事项 // 自动类型推导,必须推导出一致的数据类型T,才可以使用 mySwap(a, c); // 报错:没有与参数列表匹配的函数模板 system("pause"); return 0; }
执行这行代码mySwap(a, c)的时候,因为变量a与变量c的数据类型不一致,导致编译器无法推导出T的数据类型,从而编译时报错。
#include <iostream> #include <Windows.h> #include <string> using namespace std; template<typename T> void func() { cout << "func 调用" << endl; } int main(void) { // 函数模板注意事项 // 模板必须要确定出T的数据类型,才可以调用 func(); // 报错:无法确定T的数据类型 func<int>();// 正确:显式指定T的数据类型 system("pause"); return 0; }
执行这行代码func()的时候,因为无法确定T的数据类型,所以编译器会报错。下一行代码显式指定了T的数据类型为int,所以正确。
因此,在使用函数模板的时候,需要注意:模板必须确定出T的数据类型,才可以调用函数模板。
三、普通函数与函数模板的区别
1.普通函数调用时可以发生自动类型转换(隐式类型转换)
2.函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
3.函数模板调用时,如果利用显示指定类型的方式,可以发生隐式类型转换
#include <iostream> #include <Windows.h> #include <string> using namespace std; // 普通函数 int myAdd01(int a, int b) { return a + b; } // 函数模板 template<typename T> T myAdd02(T a, T b) { return a + b; } int main(void) { // 普通函数可以发生自动类型转换 int num = 10; char a = 'A'; // A:65 cout << "10 + A = " << myAdd01(10, a) << endl; // 函数模板,自动类型推导时,不能发生隐式类型转换 cout << "10 + A = " << myAdd02(10, a) << endl; // 报错:没有与参数列表匹配的函数模板 // 函数模板,显式指定类型时,可以发生隐式类型转换 cout << "10 + A = " << myAdd02<int>(10, a) << endl; system("pause"); return 0; }
执行这行代码cout << “10 + A = ” << myAdd02(10, a) << endl;的时候,因为函数模板无法确定T的数据类型,所以编译时报错。
总结
建议调用函数模板时,使用显示指定类型的方式,指定T的数据类型。
四、普通函数与函数模板的调用规则
调用规则如下:
1.如果普通函数和函数模板都可以调用,那么优先调用普通函数。
2.可以通过空模板参数列表来强制调用函数模板。
3.函数模板也可以发生重载。
4.如果函数模板可以产生更好的匹配,优先调用函数模板。
#include <iostream> #include <Windows.h> using namespace std; void myPrint(int a, int b) { cout << "普通函数调用" << endl; } template<typename T> void myPrint(T a, T b) { cout << "函数模板调用" << endl; } int main(void) { // 如果函数模板和普通函数都可以调用,优先调用普通函数 int a = 10; int b = 10; myPrint(a, b); system("pause"); return 0; }
运行截图:
#include <iostream> #include <Windows.h> using namespace std; void myPrint(int a, int b) { cout << "普通函数调用" << endl; } template<typename T> void myPrint(T a, T b) { cout << "函数模板调用" << endl; } int main(void) { int a = 10; int b = 10; // 通过空模板参数列表,强制调用函数模板 myPrint<>(a, b); system("pause"); return 0; }
运行截图:

#include <iostream> #include <Windows.h> using namespace std; void myPrint(int a, int b) { cout << "普通函数调用" << endl; } template<typename T> void myPrint(T a, T b) { cout << "函数模板调用" << endl; } template<typename T> void myPrint(T a, T b, T c) { cout << "重载的函数模板调用" << endl; } int main(void) { int a = 10; int b = 10; int c = 10; // 函数模板也可以发生重载 myPrint<>(a, b); myPrint<>(a, b, c); system("pause"); return 0; }
运行截图:
#include <iostream> #include <Windows.h> using namespace std; // 普通函数 void myPrint(int a, int b) { cout << "普通函数调用" << endl; } // 函数模板 template<typename T> void myPrint(T a, T b) { cout << "函数模板可以发生更好的匹配:函数模板调用" << endl; } int main(void) { char a = 'a'; char b = 'b'; // 如果函数模板可以发生更好的匹配,就优先调用函数模板 myPrint<char>(a, b); system("pause"); return 0; }
运行截图:
总结:
既然提供了函数模板,那么最好就不要提供同名的普通函数,否则容易出现二义性。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121032.html



