文章目录
一、函数模板简介1、函数模板概念2、函数模板意义 二、函数模板语法1、函数模板定义语法2、函数模板调用语法 三、函数模板代码示例1、代码示例2、执行结果 四、函数模板代码示例 - 声明多个泛型的情况1、代码示例2、执行结果
一、函数模板简介
1、函数模板概念
在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ;
函数模板 Function Template 是 C++ 语言 中的 重要特性 ;
函数模板概念 :
建立一个 " 通用函数 " , 不指定该函数的 函数返回值类型 和 函数参数类型 ,
仅使用 " 虚拟类型 " 代表 上述 两种类型 ,
该 " 通用函数 " 就是 " 函数模板 " ;
2、函数模板意义
如果 函数的 函数体 相同的 函数 , 只是 参数类型 不同 ,
这种情况下 , 可以 使用 " 函数模板 " 替代 定义 " 多个函数参数类型不同 且 函数体相同 的函数 " ;
只需要 定义一个 " 函数模板 " , 传入不同类型的参数 , 返回不同类型的结果 ;
调用 函数模板 时 根据传递的 参数类型 来生成对应的具体函数实现 , 根据 实际实参类型 取代 形参的虚拟类型 , 从而实现不同的函数功能 ;
函数模板 可以 提高代码的 复用性 和 灵活性 ;
二、函数模板语法
1、函数模板定义语法
函数模板语法 :
① 定义泛型 : 使用 template 关键字 , 告诉 C++ 编译器 开始使用 泛型编程 , 定义的 T 是泛型类型 ;template <类型形式参数列表>template <typename T>template <typename T, typename T1, typename T2>template <class T>template <class T, class T1, class T2>
在 类型形式参数列表 中 , 定义 函数模板 中需要用到的 泛型 , 格式如下 :
typename T, typename T1, typename T2 ...
也可以使用
class T, class T1, class T2...
一般情况下使用的是 前者 ;
② 定义函数模板 : 编写 函数 , 参数的 返回值类型 或 参数类型 , 可以 使用之前使用 template 定义的泛型 进行替换 , 如下示例 :// 定义函数模板 addT add(T a, T b) {return a + b;}
2、函数模板调用语法
函数模板调用 分为 两种情况 :
显式类型 调用 ;自动类型 推导 ;显式类型 调用 , 需要 在 函数名称 后 的 尖括号内 , 显式说明 泛型类型 ;
此处 T 类型为 int 类型 , 这里在 add 函数名后 , 使用 <int> 说明 泛型类型 ;
int a = 10, b = 20;// 调用函数模板// 函数模板 显式类型调用int c = add<int>(a, b);
如果 在 使用 template 关键字 声明 泛型时 , 指定了多个泛型 , 可以只使用其中的部分类型 ,
// 使用 template 关键字 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型// 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型template <typename T, typename X>
使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型 ;
虽然只使用了 泛型 T , 没有使用泛型 X , 但是 在 显式类型调用时 , 必须指定所有的类型 ;
int a = 10, b = 20;// 调用函数模板// 函数模板 显式类型调用int c = add<int, bool>(a, b);
自动类型 推导 : 该用法不常用 , 调用 函数模板 时 , 直接传入参数 , 不 显式声明 泛型类型 , 让 C++ 编译器自动推导泛型类型 ;
double x = 30.0, y = 40.0;// 调用函数模板// 函数模板 自动类型推导double z = add(x, y);
三、函数模板代码示例
1、代码示例
#include "iostream"using namespace std; // 使用 template 关键字 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 template <typename T>// 定义函数模板 addT add(T a, T b) {return a + b;}int main() {int a = 10, b = 20;// 调用函数模板// 函数模板 显式类型调用int c = add<int>(a, b);cout << "c = " << c << endl;double x = 30.0, y = 40.0;// 调用函数模板// 函数模板 自动类型推导double z = add(x, y);cout << "z = " << z << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;}
2、执行结果
执行结果 :
c = 30
z = 70
Press any key to continue . . .
四、函数模板代码示例 - 声明多个泛型的情况
1、代码示例
#include "iostream"using namespace std; // 使用 template 关键字 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型// 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型template <typename T, typename X>// 定义函数模板 addT add(T a, T b) {return a + b;}int main() {int a = 10, b = 20;// 调用函数模板// 函数模板 显式类型调用int c = add<int, double>(a, b);cout << "c = " << c << endl;double x = 30.0, y = 40.0;// 调用函数模板// 函数模板 自动类型推导double z = add<int, double>(x, y);cout << "z = " << z << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;}
2、执行结果
执行结果 :
c = 30
z = 70
Press any key to continue . . .