【C++】模板初识

这篇具有很好参考价值的文章主要介绍了【C++】模板初识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.泛型编程

在实际编程中,经常会用到交换函数。比如有整型值的交换,浮点型值的交换,字符型值的交换…
像下面代码这样:

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}
void Swap(char& x, char& y)
{
	char tmp = x;
	x = y;
	y = tmp;
}

但是,难道对于每一种类型不同的值的交换,我们都要重新写一个对应的交换函数吗?这样的话,代码的复用率和可维护性都会降低。
可以发现,上面的交换代码,仅仅是类型上有所区别,但在交换的逻辑上都是一致的。所以我们能否给编译器声明一个模具,让编译器根据这个模具来对不同类型的数据进行相同逻辑的操作呢。
【C++】模板初识

这就是要提的泛型编程了。在C++中模板又是泛型编程的基础。而模板又分为函数模板类模板,下面来依次介绍。

2.函数模板

2.1.函数模板概念

简单说,函数模板就是一系列函数的模具,编译器会在实际使用时根据传递的参数类型对函数模板进行实例化,来产生特定类型的函数。

2.2.函数模板格式

template<typename T1, typename T2, ..., typename Tn>
返回值类型 函数名(){}
例如:

template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

这里typename是用来定义模板参数的关键字,同时也可以是用class替代。
T 代表一个模板类型(也叫虚拟类型)。

2.3.函数模板使用的原理

模板的使用其实是将本来我们要做的重复的工作交给了编译器来处理。
编译器在程序编译阶段,会根据传入的参数类型来自动生成对应类型的函数以供程序调用。
当传递int类型的参数时,编译器通过对参数类型的推演,将T确定为int类型,然后会产生一份专门用于处理int类型的代码。当然对于浮点型和字符型也是同样的道理。
【C++】模板初识
【C++】模板初识

2.4.函数模板的实例化

用不同类型的参数使用函数模板时,就称为函数模板的实例化。函数模板的实例化又分为两种:隐式实例化显式实例化

  1. 隐式实例化:让编译器根据参数类型来推演模板参数的实际类型。
template<class T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int i1 = 1;
	double d1 = 1.1;
	Add(i1, d1); // error
}

上面的代码在编译期间,编译器在对函数模板进行实例化时,会进行参数类型的推演。通过实参i1T推演为int类型,通过实参d1T推演为double类型。但是该模板参数列表只有 1 个T,编译器此时会因无法确定将T确定为int类型还是double类型而报错。
上述问题有两种处理方式:
一个是使用强制类型转化来解决。

Add((double)i1, d1);
Add(i1, (int)d1);

还可以使用函数模板的显式实例化来解决。
2. 显示实例化:在函数名之后用< >指定模板参数的实际类型

Add<int>(i1, d1);
Add<double>(i1, d1);

显示实例化中,参数传递如果类型不匹配,编译器会尝试进行隐式类型转换。

2.5.模板参数的匹配原则

当一个普通函数和一个同名的函数模板同时出现时,而且该普通函数还可以通过函数模板被实例化出来。那么在函数调用时程序会优先调用普通函数而不会从模板中产生实例。但是当模板可以产生一个匹配得更好的函数时,那么还是会选择函数模板的实例化。

int Add(int x, int y)
{
	return x + y;
}

template<class T1, class T2>
T2 Add(T1 x, T2 y)
{
	return x + y;
}

int main()
{
	Add(1, 2); // 与普通函数完全匹配,不需要函数模板实例化
	Add(1, 2.2); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数

	return 0;
}

【C++】模板初识
需要注意的是:在传参时,模板函数不允许自动类型转换,而普通函数可以进行自动类型转换。

3.类模板

3.1.类模板格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
}

模板不支持分离编译,即不支持声明放在.h文件,定义放在.cpp文件。所以类模板中成员函数的定义必须和声明在一起,但这样都定义在类的内部,可能会形成内联函数。如果不希望这样,也是可以将声明和定义分离,但要在同一个文件中,因为模板在同一个文件中是可以声明和定义分离的。

3.2.类模板的实例化

类模板必须使用显式实例化。文章来源地址https://www.toymoban.com/news/detail-426006.html

vector<int> v1;
vector<double> v2;
vector<char> v3;

到了这里,关于【C++】模板初识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C++】C++泛型编程 | 模板初阶

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

    2024年02月08日
    浏览(75)
  • 【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日
    浏览(37)
  • 【C++】泛型编程 ② ( 函数模板与普通函数区别 )

    函数模板与普通函数区别 : 主要区别在于它们能够处理的 数据类型数量 和 灵活性 ; 自动类型转换 : 函数模板 不允许 自动类型转化 , 会进行严格的类型匹配 ; 普通函数 能够进行 自动类型转换 , 内含隐式的类型转化 ; 参数 / 返回值 数据类型 : 普通函数 只接受 特定类型 参数

    2024年02月20日
    浏览(36)
  • 【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

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

    2024年02月21日
    浏览(42)
  • 【c++ primer 笔记】第 16章 模板与泛型编程

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

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

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

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

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

    2023年04月25日
    浏览(51)
  • 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

    在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ; 函数模板 Function Template 是 C++ 语言 中的 重要特性 ; 函数模板概念 : 建立一个 \\\" 通用函数 \\\" , 不指定该函数的 函数返回值类型 和 函数参数类型 , 仅使用 \\\" 虚拟类型 \\\" 代表 上述 两种类型 , 该 \\\" 通用函数 \\\" 就是 \\\" 函数模

    2024年02月19日
    浏览(37)
  • 【C++】初识模板

    假设我们想实现一个交换函数,并且支持不同类型的参数实现,我们可以用 typedef 将类型进行重命名,例如以下代码: 这样我们每次需要更换类型的时候,只需要更改 int 为其他类型即可; 以上是一种方法,还有一种方法可以使用函数重载实现,例如: 以上两种方法虽然可

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包