C++ 泛型编程的基础--模板初识及应用
了解模板之前我们要先知道什么是泛型编程:泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库。泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义,而模板也是泛型编程中的一种典型例子。
函数模板
模板我们生活中也听得不少了,建房时都会有图纸,然后人们可以通过图纸来建房的基本框架。有了基本框架,任何人都可以进行自己喜欢的类型风格来装修。在C++中,模板就像图纸,我们写好了模板,也就有了基本的框架,装修风格就像C++中的类型千变万化,编译器最终会通过类型来推演出我们最终想要的函数或类。
交换函数是我们编程或刷题中最常见的函数之一,即使我们有了重载函数,但是还是因为变量的类型不同而要写多个交换函数。现在,你学会了模板,无论多少种类型变量的交换,都只要写一次就能完成。
声明模板格式:template<typename T1,typename T2,typename T3, ...>
,在函数或者类的上面添加,及表示该函数为模板函数或者模板类。注:typename可以替换成class,但是不能使用struct。
//声明模板
template <typename T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}
如何使用呢?
template <typename T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}void test()
{int a = 1;int b = 2;Swap(a, b);cout << a << " " << b << endl;double c = 1.1;double d = 2.2;Swap(c, d);cout << c << " " << d << endl;char e = 'a';char f = 'b';Swap(e, f);cout << e << " " << f << endl;
}
看上去每次Swap都会调用模板函数,但是底层其实不是这样子的,在编译阶段,编译器会将你传入的实参来推演出模板函数的类型,产生一个新的函数,并将T
替换成相对应的类型,再调用这个新的函数。我们可以通过反汇编来看看新的函数的地址。
函数的地址都是不一样的,且函数名后都会加上传入的实参的类型,我们再来看一张图,加深我们对模板底层的理解。
看到这里你一定理解和使用模板了吧,可能会有很多小伙伴想钻牛角尖,说能不能传两个不一样的类型,让编译器去推导呢?你看你坏的很,编译器不知道你想转换成哪种类型,他是不会帮你转换的。如果明确要转换的类型,编译器才会转换。
那我们想让编译器推导参数不同类型的函数可以吗?当然可以,那就必须显示实例化或者将参数强转成对应的类型
template<typename T>
T Add(T left, T right)
{return left + right;
}void test()
{int a = 1;double b = 1.1;//1、显示实例化 (告诉编译器生成类型为int的Add函数)Add<int>(a, b);//2、强转为int,此时参数类型一致Add(a, (int)b);
}
1、当一个非模板函数和一个同名模板函数同时存在时,会优先调用非模板函数
2、非模板函数和同名模板函数同时存在,编译器会根据传入的参数匹配更好的函数
3、如果知名需要进行实例化,则直接实例化,不管是否存在同名非模板函数
类模板
定义类模板和函数模板方式一样,在类前声明模板
template <class T>
class seqList
{public:seqList(int n):_data(new T[n]), _size(0), _capacity(n){}
private:T* _data;size_t _size;size_t _capacity;
};
如果在类中声明成员函数,要在类外定义函数,那么定义函数时也要在前面加上模板声明
template <class T>
class seqList
{public:seqList(int n):_data(new T[n]), _size(0), _capacity(n){}//声明成员模板函数T seqListAt(size_t pos);
private:T* _data;size_t _size;size_t _capacity;
};//类外定义成员函数
template <class T>
T seqList<T>::seqListAt(size_t pos)
{return _data[pos];
}
在我们实例化对象时,因为是自定义类型,编译器无法推导出我们想要的类的类型,所以我们必须显示实例化。
格式:类名<类型> 对象名(参数)
//类模板实例化:类名<类型> 对象名(参数)seqList<int> sq1(2);seqList<double> sq2(4);seqList<char> sq3(6);
推荐阅读
C++ 泛型模板进阶
C++ 泛型编程的基础--模板初识及应用相关推荐
- C++泛型编程:template模板
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对"一个或多个尚未明确的类型"所编写的函数或类. 使用template时, ...
- 使用vue-admin-template基础模板开发后台管理系统必会技能
1.必会一 :vue-cli vue-admin-template的使用建立在vue-cli(脚手架)基础上.官网 2.必会二 : vue-router 路由是个很重要的角色,可以管控登录权限,负责页 ...
- python定义一个dog类 类属性有名字_python 基础 12 初识类,类方法,类属性
python 基础 12 初识类,类方法,类属性 # 面向过程 : 想要一个结果 写代码 实现计算结果 # 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的 # 复杂的 拥有开 ...
- 【三】零基础入门深度学习:卷积神经网络基础之初识卷积
(给机器学习算法与Python学习加星标,提升AI技能) 作者 | 孙高峰 百度深度学习技术平台部资深研发工程师 内容来源 | 百度飞桨深度学习集训营 本文转自飞桨PaddlePaddle 导读 百度 ...
- vuejs2.0 vsCode router前后端分离权限 vueAdmin后台基础模板
感觉不错的开源项目,所以搜集资料来细致的剖析,帮助更多人尽快步入后台系统的开发,其实后台项目有两个最基础最重要的东西就是:权限验证和安全性,关于VSCode是最近很火的编辑器不做过多说明,下面的参考资 ...
- 【Straw-Uniapp-uView】基于 Uniapp + uView 搭建项目基础模板
文章目录 一.项目简介 1.项目概述 2.相关链接 3.基础功能 4.后端搭建 二.开发手册 全局约束 全局样式约束 全局that约束 代码模板 表单 消息提示 确定取消 http请求 请求拦截器 文 ...
- 【vue】基于vue2.x的vue项目最最最基础模板
前言 好久不见啊大家,今天想写这篇博客的时候才发现博客已经断更大半年了(手动滑稽) 由于去年十二月份被公司再次发配到上海出差,而且这次主要开发的是针对IE浏览器的一个插件(c++ 和 js 的交互) ...
- 可视化大屏系统基础模板+贵州省map地图json数据
最近应需求做一个可视化大屏系统,闲暇之余将成果分享一下,给需要的朋友,写的不好请见谅.如果你的需求不复杂如下所示,应该可以刚好符合你的需求. 一.项目演示: 基础模块: 全省数据: 各地市(遵义)地图 ...
- Flask web开发实战之基础篇 初识Flask
基础篇 第一章 初识Flask 前言 1. 初识Flask 1.1.搭建开发环境 1.1.1 pipenv工作流 1.1.2 创建虚拟环境 1.1.3 管理环境依赖 1.1.4 安装Flask 1.2 ...
最新文章
- Mac zsh not found jupyter notebook
- 31.openssl编程——SSL实现
- (*长期更新)软考网络工程师学习笔记——Section 14 Linux服务器配置
- ATL 和 MFC 字符转换宏
- Java StreamTokenizer quoteChar()方法与示例
- LaTeX设置长公式的跨页显示
- 以太坊源码(03):POA委员会选举机制
- python 制作聊天程序-python实现点对点聊天程序
- 为什么产品经理总被吐槽是”水货“
- tushare平台介绍
- Java之小球碰撞反弹
- winNTsetup安装器安装系统教程
- 【FineBI】权限控制之动态维度/动态列
- 互联网创业的五大定律
- 【设计模式05】单例模式
- 基于 OE、Yocto、Arago 构建 TI 板卡的定制文件系统
- 湖人詹姆斯 戴维斯 拉塞尔三人合体就赢!
- 如何区分一个股票属于哪个证券交易所的,如何区分一个股票是上证指数还是深圳指数?
- 现代社会,各行各业的竞争越来越激烈
- 传陌陌科技公司将赴美IPO
热门文章
- yum安装ruby_rediscluster安装
- matlab dotchart,MATLAB中如何用对数方式显示图形坐标?
- button标签设置隐藏和显示_让你更高效的功能——设置、预设的妙用【动态数学软件GeoGebra】...
- 深度linux添加xp,Linux和Windos XP下向路由表添加路由
- Ehcache小结(二)
- dev下没有ttyusb_Dev C++ 软件安装教程
- vue 自定义组件 v-model
- Java学习笔记day08_day09_对象实例化_private_this
- QT C1041错误
- CSerialPort串口类最新修正版(解决关闭死锁问题)