【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)

本文主要是介绍【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏: 《C++干货基地》《粉丝福利》

⛺️生活的理想,就是为了理想的生活!

引入

  哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作为一门篇底层的一种语言,世面的免费课程大多都没有教明白。所以本篇专栏的内容全是干货让大家从底层了解C++,把更多的知识由抽象到简单通俗易懂。

⛳️ 推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

  • 引入
  • ⛳️ 推荐
  • 一、模版的概念
    • 1.1 模版的概念提出
    • 1.2 模版函数的格式
    • 1.3 模版的原理
  • 二、函数模版
    • 2.1 函数模板的实例化
      • 隐式实例化
      • 显式实例化
    • 2.2模板参数的匹配原则
  • 三、类模版
    • 3.1 类模板的定义格式
    • 3.2 类模板的实例化
  • 四、模版带来的改变?
    • 4.1 STL 的出现
  • 五、图书推荐
    • 5.1 码农修行 编写优雅代码的了32条法则
    • 5.2 图书简介
    • 5.3 图书内容
    • 5.4 购买连接
  • 六、 粉丝福利&参与规则

一、模版的概念

1.1 模版的概念提出

虽然C++支持了函数重载但是,我们如果要写一个通用的交换函数的就就要重载各种不同类型的函数这也太麻烦了。

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}
......

那么我们是否可以让编译器像活字印刷一样,需要那种类型的函数直接生成一个就好了?
在这里插入图片描述

  • 我们能想到的点祖师爷自然也能想到所以在C++中有模版的语法来帮我们解决代码冗余的问题来提高通用性。

1.2 模版函数的格式

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表)
{//函数的实现 
}
  • 下面我们就来使用模版的格式来写一个通用的交换函数吧!
template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

1.3 模版的原理

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用

  • 比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

在这里插入图片描述

  • 而我们通过汇编代码也可以看出来编译器通过模版来生成不同的交换函数

在这里插入图片描述

二、函数模版

2.1 函数模板的实例化

隐式实例化

  • 隐式实例化:让编译器根据实参推演模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2)return 0;
}

这个我相信大家理解,就正常使用函数就好了,但有时候我们需要模版只定义了一种类型但我们却传了俩种类型不同的数据这时候就会出现报错了如果想让它继续运行的话,就得使用显式实例化或者自己强制转换为一样的类型。


template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);Add(a1, (int)d1);return 0;
}

显式实例化

  • 显式实例化:在函数名后的 <> 中指定模板参数的实际类型
int main(void)
{int a = 10;double b = 20.0;// 显式实例化Add<int>(a, b);return 0;
}

2.2模板参数的匹配原则

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add<int>(1, 2); // 调用编译器特化的Add版本
}int main()
{Test();return 0;
}
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
// 专门处理int的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}
void Test()
{Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函
}

三、类模版

3.1 类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
}; 
template<class T>
class Stack
{
public:void push(const T& x);
private:T* _a;int _top;int _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template<class T>
void Stack<T>::push(const T& x)
{//...
}int main()
{// 同一个类模板实例化出的两个类型Stack<int> s1;Stack<double> s2;return 0;
}

3.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

Stack<int> s1;
Stack<double> s2;

四、模版带来的改变?

4.1 STL 的出现

模版的出现使的我们代码的通用性和扩展性更高,以往我们库函数想要支持交换函数很麻烦。但是有了模版我们只需呀写一个库模版就可以支持不同类型的库函数。

  • 比如说我们的 数据结构 如果是C语言我们想要不同类型的数据结构来存储数据就需要好几种所以C语言库里没有数据结构的库函数。
  • 而C++ 有了模版只需要写一个数据结构模版就可以实现存不同类型数据的需求了,这也是我们后面需要学习的容器。
  • 所以可以说模版是C++最大的精华,有了模版才有后来的STL 容器等等。

在这里插入图片描述

五、图书推荐

5.1 码农修行 编写优雅代码的了32条法则

5.2 图书简介

如何打造精品软件一直是软件行业讨论的热点话题。初入职场的软件开发人员,多数都只是在学会了某种编程语言后就直接进行编程工作。但由于他们并未掌握编程中的一些有效方法,导致其开发的软件问题累累且工作效率不高。《码农修行》编写优雅代码的32条法则针对这类人群提出了一些改善编程方法的建议,涉及具体编程工作的诸多方面,偏重于实践。书中大部分示例都是笔者实际编程工作中碰到过的真实案例,具有较高的参考价值。

《码农修行》编写优雅代码的32条法则从代码的可 读性、可靠性、效率、可维护性、可扩展性5个方面,提出了编写代码的32 条法则 。此外还公开了笔者自主编写的一款Android 小游戏源代码,希望能对读者有所帮助。《码农修行》编写优雅代码的32条法则适用于有一定编程基础、且想进一步提升个人编程能力的读者阅读,也可作为大中专院校计算机专业师生的教学参考用书。

5.3 图书内容

在这里插入图片描述

5.4 购买连接

京东连接: https://item.jd.com/12711115.html

六、 粉丝福利&参与规则

  • 参与方式:关注博主、点赞收藏评论,任意评论(每人最多评论三次)

  • ⛳️本次送书5取决于阅读量,阅读量越多,送的越多

  • 📆 活动时间至:2024-2-27 20:00:00 | 随机抽取由博主动态公布抽奖结果

如有特别需要的同学可添加博主微信进入粉丝福利群发放福利哦!

🔥 注:活动结束后,会私信中奖粉丝的,各位注意查看私信哦!

在这里插入图片描述

这篇关于【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948873

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN