模板

一般我们在实现一个函数的时候,都会使用模板,因为如果将类型写死,下次再使用的时候就要新写一个函数,尽管重载可以让名字方便,但每重载都要自己去写一个函数,这样非常麻烦,所以模板就是让编译器自己去推导,来生成对应的函数,从而实现泛型编程。

重载的缺点:
1、代码复用率低,只要有新类型出现,就得重新写函数。
2、安全性问题,只要一个重载函数出现问题,所有的重载函数都出错。

泛型编程:编写与类型无关的通用代码,是代码复用的手段,模板是泛型编程的基础。

函数模板

格式

template<class T>
bool Compare(T& t1,T& t2)
{return t1 < t2;
}

实例化

隐式实例化:
由编译器自己推导的称为隐式实例化,上面函数如果传入 <int,double> 会在编译期间就报错,因为编译器无法确定T是int还是double,可以显示强转或显式实例化。

int a = 10;
double b = 20;//编译失败
Compare(a,b);

显式实例化:
如果类型不匹配,编译器会自动对不匹配的类型进行隐式类型转换,如果不行就报错。

int a = 10;
double b = 20;//显式实例化
Compare<int>(a,b);

类模板

格式

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

ps:类外定义的函数需要加上类模板参数列表:

template <class T>
Vector<T>::func()
{}

实例化

类模板实例化需要指定类型,比如

vector<int> v;

其中 vector 不是 类型, vector 才是类型。

仿函数

正如其名,仿函数就是用类来模仿一个函数,实例如下:

template<class T>
class Compare
{public:bool operator() (const T& t1,const T& t2)  {return t1 < t2;}
};

非类型模板参数

类型形参:
跟在class/typename后面的参数,int、double

非类型形参:
可以是具体的一个变量,但是不能是浮点数、字符、字符串等…

实例:

template<class T, size_t N = 100>
class test
{};

模板特化

函数模板特化

为什么需要模板特化:
上面的比较函数在基本类型的比较中是没有问题的,但如果我们比较两个指针的内容显然是不合适的,我们又想要能够比较两个指针的内容,我们就可以选择特化:
示例:

template<class T>
bool Compare(T t1, T t2)
{return t1 < t2;
}template<>
bool Compare<int*>(int* t1, int* t2)
{return *t1 < *t2;
}

但是注意:必须要和模板函数的参数列表完全相同:

template<class T>
bool Compare(T& t1, T& t2)
{return t1 < t2;
}template<>
bool Compare<int*&>(int*& t1, int*& t2)
{return *t1 < *t2;
}

类模板特化

全特化

template<class T1,class T2>
class Data
{};template<>
class Data<int, char>
{};

偏特化

//偏特化
template<class T1>
class Data<T1, char>
{};
//进一步限制
template<class T1>
class Data<T1*, char>
{};

模板分离编译

模板分离编译为什么会有问题:

先来回顾一下程序编译的过程:

解释:编译阶段拿到函数声明,可以顺利通过编译,但无法通过链接,因为链接时找不到函数地址(函数没有实例化)。

【c++修行之路】模板相关推荐

  1. C/C++学习之路: 模板和异常

    C/C++学习之路: 模板和异常 目录 模板 类型转换 异常 1. 模板 1. 模板概述 c++提供了函数模板(function template),函数模板实际上是建立一个通用函数,其函数类型和形参 ...

  2. 菜鸟修行之路----项目实战:微人事项目之项目概述

    菜鸟修行之路----项目实战:微人事项目之项目概述 ​ 修行之路艰辛,与君共勉!! ​ 从即日起,通过对于github上非常热门的前后端分离开发的开源项目:微人事管理系统的全面学习以及自主手写代码实现 ...

  3. 读稻盛和夫《活法》-现代人的修行之路

    作 者: 稻盛和夫(Kazuo Inamori),林慧如 著 出 版 社: 东方出版社 ISBN:9787506036603 这一生为何而来? 被人生种种欲望束缚和迷惑,可以说是人类的天性.人生的意义 ...

  4. python 修行之路(1-自我介绍及python环境的搭建)

    一.自我介绍 我是一个代码小白,做的非IT的工作.生活的城市因为电子和IT技术的普遍性(呵呵,其实也和收入有关),也有想学习一门技术的想法,误打误撞的走上了学习Python的道路.其实对于一个纯小白来 ...

  5. 【JAVA修行之路】--“斩杀”对象和类

    文章目录 对象和类 理解对象 对象的属性和方法 封装 类 理解 类 类的属性 类的方法 对象和类的区别 关系 类是对象的类型 JAVA的类模板 如何定义类 定义类名 编写类的属性 编写类的方法 创建和 ...

  6. python修行之路(六 三级菜单实例)

    三级菜单实例: menu = {     '北京':{         '海淀':{             '五道口':{                 'soho':{},            ...

  7. 感谢有你们,架构师修行之路!

    感谢有你们 转眼马上就十月一了,听说今年的阵势非常强大,菜菜虽然身在北京,但是可能也目睹不了这个激动时刻了.自从2018年年底决定开始写公众号以来,几乎每个周末都在构思文章,撰写文章.关注公众号的老粉 ...

  8. [JavaWeb修行之路 Day1] 安装、配置、部署Tomcat

    一.相关软件下载 Tomcat下载地址:http://tomcat.apache.org .选择Tomcat 6或者Tomcat 7. Eclipse下载地址:http://www.eclipse.o ...

  9. 欲练JS,必先攻CSS——前端修行之路

    今天我讲的主题是css,具体聊一下我大概的css学习历史,分享一些干货,希望这次分享对大家有所启发和帮助. 个人的css历史 说说自己的css学习的历史,12年,当时是老师手把手1对1教我div+fl ...

最新文章

  1. python下处理win和linux分行符
  2. 【NLP】ALBERT:更轻更快的NLP预训练模型
  3. 三种实现分布式解决方案原理分析
  4. (转)!注意:PreTranslateMessage弹出框出错
  5. 如何判断2服务器性能好或坏_无服务器革命:好,坏和丑
  6. C# 9.0 新功能一览
  7. 循环的中断操作(C#基础回顾03)
  8. 高中上计算机专业用买电脑吗,大一新生有必要买电脑吗
  9. 30秒的PHP代码片段(1)数组 - Array
  10. 贪心整理一本通1431:钓鱼题解
  11. 这几个问题解决了,怎么设计大型网站架构不再是困难
  12. python元组可以修改吗_python元组元素可以修改吗
  13. mixin风格的bases class
  14. 【目标定位】基于matlab卡尔曼滤波UWB-IMU组合定位导航【含Matlab源码 1601期】
  15. python输出unicode字符_如何在Python中打印Unicode字符?
  16. 史上最全!数学参考书大评测及常见问题
  17. c600 raid linux,华硕Z9PA-D8 (-C600 INTEL RAID)主板驱动3.8.0.1108版下载,适用于Win8-64,win7,Win7-64,winxp-驱动精灵...
  18. js文档模式之混杂模式与标准模式
  19. lineedit加入边框 qt_qt qlineedit 边框
  20. Android安卓原生接支付宝SDK支付客户端

热门文章

  1. 安卓开发项目——智能农业
  2. 一键批量查询快递单号
  3. 一个 ~ 引发的悲剧
  4. 谷物清选机设计_轴用弹性挡圈装配机的设计_双柱机械式汽车举升机_助老型全自动“方便阅读架”机械、控制结构的设计_5T单梁桥式起重机金属结构设计_2000KN四柱式通用液压机设计……
  5. ssoj4027: 挖煤(coal)
  6. PHP实现局域网或者广域网唤醒笔记本电脑wake on lan/wan
  7. PDF-XChange编辑器可快速添加笔记!自定义快捷键!保姆级教程!
  8. idea快捷键 PDF 中文版
  9. 【时间处理】Python 计算两个日期相差的天数
  10. 2022就业环境以及市场分析,职业前景。