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

这篇具有很好参考价值的文章主要介绍了【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。






一、函数模板简介




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 . . .


c++泛型编程 模板函数调用,C++,c++,泛型编程,函数模板,template





四、函数模板代码示例 - 声明多个泛型的情况




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;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

2、执行结果


执行结果 :


c = 30
z = 70
Press any key to continue . . .


c++泛型编程 模板函数调用,C++,c++,泛型编程,函数模板,template文章来源地址https://www.toymoban.com/news/detail-825964.html

到了这里,关于【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

    上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板 的调用规则 ; 为 函数模板 重载了 普通函数 , 普通函数有指定的类型 ; 传入实参 , 调用 普通函数 还是 模板函数 , 是有一定的规则的 ; 普通函数 与 传入实

    2024年02月21日
    浏览(41)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(50)
  • c++模板编程2-函数模板的定义和使用

    两阶段编译检查 在实例化模板的时候,如果模板的参数类型不支持模板中用到的操作符,将会遇到编译期错误,例: 以上例子 add(a, b) 会在编译器报错,但在模板定义的地方并没有出现错误提示,这是因为模板是分两步编译的: 在模板定义阶段,模板的检查并不包含类型参

    2024年02月06日
    浏览(30)
  • 【C++】泛型编程——模板进阶

    在之前的文章里,我们进行了模板初阶的学习( 【C++】泛型编程——模板初阶),了解了什么是泛型编程,学习了函数模板和类模板。 那这篇文章,我们继续学习模板进阶的内容的学习。 首先我们来回顾一下: 我们在模板初阶的学习中,定义模板参数是怎么定义的? 是不

    2024年02月16日
    浏览(32)
  • C++泛型编程之模板

    目录 一、什么是泛型编程  二、函数模板 2.1函数模板的概念 2.2函数模板格式 2.3函数模板的原理  2.5函数模板的实例化 2.6模板参数的匹配原则 三、类模板 3.1类模板的定义格式 3.2 类模板的实例化 四、非类型模板参数 五、模板的特化 5.1模板特化的概念: 5.2函数模板特化 5

    2024年02月07日
    浏览(37)
  • 【C++】C++泛型编程 | 模板初阶

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言 ❤️ 初阶数据结构与算法 ❤️ C++ ❤️

    2024年02月08日
    浏览(72)
  • 【C++基础(十)】C++泛型编程--模板初阶

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 在学习数据结构时会遇见以下的情况 数据结构中存储的类型往往不能确定 所以在实现数据结构时往往是这样做的 在写代码时用DateType来表

    2024年02月13日
    浏览(31)
  • C++——模板初阶与泛型编程

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(36)
  • 【c++ primer 笔记】第 16章 模板与泛型编程

    🎉作者简介:👓 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c+

    2024年02月20日
    浏览(39)
  • C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月27日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包