了解模板之前我们要先知道什么是泛型编程:泛型编程的代表作品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++ 泛型编程的基础--模板初识及应用相关推荐

  1. C++泛型编程:template模板

    泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对"一个或多个尚未明确的类型"所编写的函数或类. 使用template时, ...

  2. 使用vue-admin-template基础模板开发后台管理系统必会技能

    1.必会一 :vue-cli vue-admin-template的使用建立在vue-cli(脚手架)基础上.官网 2.必会二 : vue-router 路由是个很重要的角色,可以管控登录权限,负责页 ...

  3. python定义一个dog类 类属性有名字_python 基础 12 初识类,类方法,类属性

    python 基础 12 初识类,类方法,类属性 # 面向过程 : 想要一个结果 写代码 实现计算结果 # 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的 # 复杂的 拥有开 ...

  4. 【三】零基础入门深度学习:卷积神经网络基础之初识卷积

    (给机器学习算法与Python学习加星标,提升AI技能) 作者 | 孙高峰 百度深度学习技术平台部资深研发工程师 内容来源 | 百度飞桨深度学习集训营 本文转自飞桨PaddlePaddle 导读 百度 ...

  5. vuejs2.0 vsCode router前后端分离权限 vueAdmin后台基础模板

    感觉不错的开源项目,所以搜集资料来细致的剖析,帮助更多人尽快步入后台系统的开发,其实后台项目有两个最基础最重要的东西就是:权限验证和安全性,关于VSCode是最近很火的编辑器不做过多说明,下面的参考资 ...

  6. 【Straw-Uniapp-uView】基于 Uniapp + uView 搭建项目基础模板

    文章目录 一.项目简介 1.项目概述 2.相关链接 3.基础功能 4.后端搭建 二.开发手册 全局约束 全局样式约束 全局that约束 代码模板 表单 消息提示 确定取消 http请求 请求拦截器 文 ...

  7. 【vue】基于vue2.x的vue项目最最最基础模板

    前言 好久不见啊大家,今天想写这篇博客的时候才发现博客已经断更大半年了(手动滑稽) 由于去年十二月份被公司再次发配到上海出差,而且这次主要开发的是针对IE浏览器的一个插件(c++ 和 js 的交互) ...

  8. 可视化大屏系统基础模板+贵州省map地图json数据

    最近应需求做一个可视化大屏系统,闲暇之余将成果分享一下,给需要的朋友,写的不好请见谅.如果你的需求不复杂如下所示,应该可以刚好符合你的需求. 一.项目演示: 基础模块: 全省数据: 各地市(遵义)地图 ...

  9. Flask web开发实战之基础篇 初识Flask

    基础篇 第一章 初识Flask 前言 1. 初识Flask 1.1.搭建开发环境 1.1.1 pipenv工作流 1.1.2 创建虚拟环境 1.1.3 管理环境依赖 1.1.4 安装Flask 1.2 ...

最新文章

  1. Mac zsh not found jupyter notebook
  2. 31.openssl编程——SSL实现
  3. (*长期更新)软考网络工程师学习笔记——Section 14 Linux服务器配置
  4. ATL 和 MFC 字符转换宏
  5. Java StreamTokenizer quoteChar()方法与示例
  6. LaTeX设置长公式的跨页显示
  7. 以太坊源码(03):POA委员会选举机制
  8. python 制作聊天程序-python实现点对点聊天程序
  9. 为什么产品经理总被吐槽是”水货“
  10. tushare平台介绍
  11. Java之小球碰撞反弹
  12. winNTsetup安装器安装系统教程
  13. 【FineBI】权限控制之动态维度/动态列
  14. 互联网创业的五大定律
  15. 【设计模式05】单例模式
  16. 基于 OE、Yocto、Arago 构建 TI 板卡的定制文件系统
  17. 湖人詹姆斯 戴维斯 拉塞尔三人合体就赢!
  18. 如何区分一个股票属于哪个证券交易所的,如何区分一个股票是上证指数还是深圳指数?
  19. 现代社会,各行各业的竞争越来越激烈
  20. 传陌陌科技公司将赴美IPO

热门文章

  1. yum安装ruby_rediscluster安装
  2. matlab dotchart,MATLAB中如何用对数方式显示图形坐标?
  3. button标签设置隐藏和显示_让你更高效的功能——设置、预设的妙用【动态数学软件GeoGebra】...
  4. 深度linux添加xp,Linux和Windos XP下向路由表添加路由
  5. Ehcache小结(二)
  6. dev下没有ttyusb_Dev C++ 软件安装教程
  7. vue 自定义组件 v-model
  8. Java学习笔记day08_day09_对象实例化_private_this
  9. QT C1041错误
  10. CSerialPort串口类最新修正版(解决关闭死锁问题)