C++编程语言关于模板的学习笔记
C++编程语言关于模板的学习笔记
- 1.模板函数
- 1.1基本概念
- 1.2模板函数推演示例:
- 1.3区分完全泛化、部分特化以及完全特化
- 1.4注意点:
- 2.模板类
- 2.1模板类编译时的推演规则
- 2.2可以有非类型,并且当我们的N为不同的值的时候,对象类型也会不同
- 2.3类模板中函数的编译问题
- 2.4模板类型参数可以赋默认值
- 2.5模板类型参数可以有多个
- 2.6什么时候是模板类型
- 2.7类型萃取问题引入
1.模板函数
1.1基本概念
模板是在编译时期产生代码,它的执行并不是宏的替换,而是重命名规则
//传参后,模板函数编译时候如下,而不是将Type替换为int
typedef int Type;
void Swap<int>(Type& a,Type& b)
{Type tmp=a;
a=b;
b=tmp;
}
而下面的N是一个宏替换,替换一个常量,
1.2模板函数推演示例:
通过下面的示例中传入的不同参数,我们来分析一下在编译时期T被推演为什么?(注释已经给出推演的结果)
示例1:
示例2:
示例3:
示例4:
1.3区分完全泛化、部分特化以及完全特化
1.4注意点:
①因为引用(&)的底层是int * const (常性指针),传引用进去之后,编译器对于int* 之后的const无法进行推演,所以编译不通过。
所以我们需要在模板函数中T的后面手动加上const
②模板函数也是可以重载的
2.模板类
2.1模板类编译时的推演规则
给类名称后面加上T的具体类型
然后在类内用typedef给这个具体类型重命名为T
2.2可以有非类型,并且当我们的N为不同的值的时候,对象类型也会不同
比如下面的N分别为100,10,在进行替换之后,会实例化出两个不同的对性(原因是成员属性都不相同,因此就是不同的对象)。
2.3类模板中函数的编译问题
类模板中的函数,如果调动了,类模板里面的函数才会参与编译,不调动就不会参与编译
所以下面将N的值改变,如果我们不调用是并不会检测出错误的。
2.4模板类型参数可以赋默认值
2.5模板类型参数可以有多个
2.6什么时候是模板类型
Arrayiat,因为已经明确的给出一个整型,所以编译器就会实例化出具体的内容,那么这就是一个具体的类型
Array 这就是一个模板类型,因为没有给出明确的类型,编译器无法做出判断要处理怎样的类型。
template<class T>
class Array
{enum{INIT=10};T* data;size_t capacity;size_t count;
};
int main()
{Array<int>iar;//这不是一个模板类型,因为编译器会把它实例化为下面的代码:/*class Array<int>{typedef int T;enum{INIT=10};T* data;size_t capacity;size_t count;};*/Array//这是一个模板类型
}
2.7类型萃取问题引入
T是一个类型,
seq是一个类型,此类型能够接收的必须是一个模板类型,此模板类型必须带有一个模板参数
如果说在主函数的使用中,出现这样的情况:
Container<int,Array>contatiner;
那么这就会导致Array这不是一个模板类型,变成具体的设计类型,所以应该变成这样:Container<int,Array>contatiner;
如何类型萃取,能够将T明确出来是int类型呢?
不要直接把程序中的T全部换成int,或者其他具体的类型,这是枯燥的,因此需要类型萃取。
C++编程语言关于模板的学习笔记相关推荐
- Volecity模板引擎学习笔记一
最近项目中用到了volecity模板,这里做一下笔记,学习中...相比较 FreeMarker 而言,Velocity 更加简单.轻量级,但它的功能却没有 FreeMarker强大. 1,首先结合开发 ...
- 10-C++远征之模板篇-学习笔记
C++远征之模板篇 本文及代码收录于个人编程笔记(整理中,欢迎Star): https://github.com/mtianyan/Programming-Notebook 将会学到的内容: 模板函数 ...
- 设计模式之模板模式学习笔记
前言 相信大家都写过各种各样的文档,需求文档.设计文档.使用手册等等.为了提高复用性和灵活度,需要采用一系列的模板来应对. 定义 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法 ...
- php 控制器 模板,php学习笔记(一)php模板与控制器
/welcome/index.php if(!isset($_REQUEST['fn'])) { include 'from.html.php'; } else { $firstname = $_RE ...
- Jinjia2模板引擎学习笔记
Jinjia2 模板引擎 形式最简单的Jinjia2模板引擎就是一个包含响应文本的文件. 1渲染模板 默认情况下,flask在应用中的templates子目录里面寻找模板. flask提供的rende ...
- html5教程 w3cschool,W3Cschool学习笔记——HTML5基础教程
HTML5 建立的一些规则:新特性应该基于 HTML.CSS.DOM 以及 JavaScript. 减少对外部插件的需求(比如 Flash) 更优秀的错误处理 更多取代脚本的标记 HTML5 应该独立 ...
- ant design pro模板_Ant Design Pro 学习笔记
学习笔记 摘要介绍 Ant Design Pro 是一个基于Ant Design搭建起来的模板项目.它提供了两个主要布局:BasicLayout.UserLayout,在布局基础上制作了20多个基础页 ...
- 图形处理(十三)基于可变形模板的三维人脸重建-学习笔记
基于可变形模板的三维人脸重建-学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50331423 作者:hjimce 一.数据库处理: 我们通 ...
- opencv进阶学习笔记8:模板匹配
基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 模板匹配原理 模板匹配(Te ...
最新文章
- 蚂蚁金服安全应急响应中心上线 用户可提交漏洞
- 清空memcached中缓存的数据的方法
- PHP的错误机制总结
- Win10下Wireshark找不到网卡的方法
- 2020最后一天,送出家里书架全部好书,随意挑
- 事件查看器ID 1041
- 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
- verilog实现伺服电机控制
- 寄存器相互映射是什么意思_STM32入门系列-STM32外设地址映射
- 高德坐标转百度坐标并导航
- python 表格格式输出_简单介绍python输出列表元素的所有排列形式
- Atitit 持久化 之道 attilax 艾龙著 1. 第2章 Java对象持久化技术概述 	2 1.1. 2.1 直接通过JDBC API来持久化实体域对象	2 1.2. 2.2 ORM简介	2
- 【项目管理】三点估算
- Android蓝牙发送hc05,【MM32F103试用体验】+HC05蓝牙与Android手机通信
- Android 9.0 蓝牙配对流程
- 物联网Wifi三大新主流势均力敌 SIP时代即将来袭
- 数据库面试复习_数据科学面试复习
- python培训班怎样收费
- 孫丕恕:計算力已成為數字經濟先行指數 決定未來發展潛力
- 谷歌浏览器在线观看视频有声音但画面黑屏问题解决
热门文章
- oaf java_OAF_开发系列25_实现OAF中Java类型并发程式开发oracle.apps.fnd.cp.request(概念)...
- 如何优化数据库?如何提高数据库性能?
- 面试常问到:如何优化数据库?
- 苹果备忘录怎么调字体大小_苹果备忘录怎么找回上次编辑的便签内容?
- 基于HD-RK3568-IO评估板的读写速度测试报告
- 名创优品搭建私域流量池,公众号引流企微,实现社群粉丝快速增长
- 各个搜索引擎的User-Agent
- 斐波那契数列和青蛙跳台阶问题
- C++中的opeartor new和placement new详解
- dd将硬盘驱动器复制到另一个硬盘驱动器并监控dd的进度