函数模板详解

函数模板详解详细介绍 函数模板 函数模板的注意事项 普通函数和函数模板的区别 普通函数与函数模板的调用规则

大家好,欢迎来到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

(0)
上一篇 2025-10-25 22:15
下一篇 2025-10-25 22:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信