相关文章推荐
痴情的红薯  ·  Win10/Win7 ...·  1 年前    · 
俊秀的跑步机  ·  Ace-editor编辑器输入内容时光标自动 ...·  1 年前    · 
幸福的草稿本  ·  用Python实现进制转换,这一篇教程就够了 ...·  1 年前    · 
霸气的跑步机  ·  如何用CSS让背景有透明度文字不变 - ...·  2 年前    · 
犯傻的小笼包  ·  【现代C++】原始字符串-raw ...·  2 年前    · 
小百科  ›  【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 缺省类型调用 | 自动类型假设 )-腾讯云开发者社区-腾讯云
函数调用 泛型 泛型编程
怕老婆的仙人球
1 年前
韩曙亮
0 篇文章

【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
韩曙亮
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 韩曙亮的移动开发专栏 > 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

作者头像
韩曙亮
发布 于 2023-11-15 09:42:35
133 0
发布 于 2023-11-15 09:42:35
举报

一、函数模板简介

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 定义的泛型 进行替换 , 如下示例 :
// 定义函数模板 add
T 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>
// 定义函数模板 add
T 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>
// 定义函数模板 add
T 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;
	// 控制台暂停 , 按任意键继续向后执行
 
推荐文章
痴情的红薯  ·  Win10/Win7 SP1推送新正式版:增强安全性和稳定性|Win10|推送|安全性_新浪科技_新浪网
1 年前
俊秀的跑步机  ·  Ace-editor编辑器输入内容时光标自动跳到最开头_ueditor中编辑光标会跑到最前面_旭今天学习了的博客-CSDN博客
1 年前
幸福的草稿本  ·  用Python实现进制转换,这一篇教程就够了 - 知乎
1 年前
霸气的跑步机  ·  如何用CSS让背景有透明度文字不变 - 纪田君 - 简书
2 年前
犯傻的小笼包  ·  【现代C++】原始字符串-raw string literal - 一只年龄很大的小学生 - SegmentFault 思否
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号