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++编程语言关于模板的学习笔记相关推荐

  1. Volecity模板引擎学习笔记一

    最近项目中用到了volecity模板,这里做一下笔记,学习中...相比较 FreeMarker 而言,Velocity 更加简单.轻量级,但它的功能却没有 FreeMarker强大. 1,首先结合开发 ...

  2. 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 本文及代码收录于个人编程笔记(整理中,欢迎Star): https://github.com/mtianyan/Programming-Notebook 将会学到的内容: 模板函数 ...

  3. 设计模式之模板模式学习笔记

    前言 相信大家都写过各种各样的文档,需求文档.设计文档.使用手册等等.为了提高复用性和灵活度,需要采用一系列的模板来应对. 定义 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法 ...

  4. php 控制器 模板,php学习笔记(一)php模板与控制器

    /welcome/index.php if(!isset($_REQUEST['fn'])) { include 'from.html.php'; } else { $firstname = $_RE ...

  5. Jinjia2模板引擎学习笔记

    Jinjia2 模板引擎 形式最简单的Jinjia2模板引擎就是一个包含响应文本的文件. 1渲染模板 默认情况下,flask在应用中的templates子目录里面寻找模板. flask提供的rende ...

  6. html5教程 w3cschool,W3Cschool学习笔记——HTML5基础教程

    HTML5 建立的一些规则:新特性应该基于 HTML.CSS.DOM 以及 JavaScript. 减少对外部插件的需求(比如 Flash) 更优秀的错误处理 更多取代脚本的标记 HTML5 应该独立 ...

  7. ant design pro模板_Ant Design Pro 学习笔记

    学习笔记 摘要介绍 Ant Design Pro 是一个基于Ant Design搭建起来的模板项目.它提供了两个主要布局:BasicLayout.UserLayout,在布局基础上制作了20多个基础页 ...

  8. 图形处理(十三)基于可变形模板的三维人脸重建-学习笔记

    基于可变形模板的三维人脸重建-学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50331423 作者:hjimce 一.数据库处理: 我们通 ...

  9. opencv进阶学习笔记8:模板匹配

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 模板匹配原理 模板匹配(Te ...

最新文章

  1. 蚂蚁金服安全应急响应中心上线 用户可提交漏洞
  2. 清空memcached中缓存的数据的方法
  3. PHP的错误机制总结
  4. Win10下Wireshark找不到网卡的方法
  5. 2020最后一天,送出家里书架全部好书,随意挑
  6. 事件查看器ID 1041
  7. 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
  8. verilog实现伺服电机控制
  9. 寄存器相互映射是什么意思_STM32入门系列-STM32外设地址映射
  10. 高德坐标转百度坐标并导航
  11. python 表格格式输出_简单介绍python输出列表元素的所有排列形式
  12. Atitit 持久化 之道 attilax 艾龙著 1. 第2章 Java对象持久化技术概述 2 1.1. 2.1 直接通过JDBC API来持久化实体域对象 2 1.2. 2.2 ORM简介 2
  13. 【项目管理】三点估算
  14. Android蓝牙发送hc05,【MM32F103试用体验】+HC05蓝牙与Android手机通信
  15. Android 9.0 蓝牙配对流程
  16. 物联网Wifi三大新主流势均力敌 SIP时代即将来袭
  17. 数据库面试复习_数据科学面试复习
  18. python培训班怎样收费
  19. 孫丕恕:計算力已成為數字經濟先行指數 決定未來發展潛力
  20. 谷歌浏览器在线观看视频有声音但画面黑屏问题解决

热门文章

  1. oaf java_OAF_开发系列25_实现OAF中Java类型并发程式开发oracle.apps.fnd.cp.request(概念)...
  2. 如何优化数据库?如何提高数据库性能?
  3. 面试常问到:如何优化数据库?
  4. 苹果备忘录怎么调字体大小_苹果备忘录怎么找回上次编辑的便签内容?
  5. 基于HD-RK3568-IO评估板的读写速度测试报告
  6. 名创优品搭建私域流量池,公众号引流企微,实现社群粉丝快速增长
  7. 各个搜索引擎的User-Agent
  8. 斐波那契数列和青蛙跳台阶问题
  9. C++中的opeartor new和placement new详解
  10. dd将硬盘驱动器复制到另一个硬盘驱动器并监控dd的进度