引言: 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

在我们刚开始接触编程的时候,基本上新手都会自己编写一个交换函数(参数暂且为int),当我们的类型不是int而变成了double,我们是不是就要对函数进行重载来支持不同参数类型的函数,例如:

void Swap(int& left,int& right)
{int temp=left;left=right;right=temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp; }void Swap(char& left, char& right)
{char temp = left;left = right;right = temp; }

使用函数重载虽然能解决上述问题,但是有以下几个不好的地方:

  1. 重载的函数只是类型不同,代码的利用率低下
  2. 代码的可用率低,一个出错可能所有的重载都有错

此时,编译器为我们提供了一个模子,它可以根据我们不同的类型参数来生成代码,接下来主角模板就出现了

一、函数模板

函数模板的概念:

函数模板代表了一个函数家族,该函数模板与类型无关,只有在使用时被参数化,根据实参类型产生特定类型版本。

函数模板的格式:

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
template<typename T>//此语句也可以为template<class T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

函数模板的原理:

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器


在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

函数模板的实例化:

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
template<class T> T Add(const T& left, const T& right)
{return left + right;
}int main(){int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);/*该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅Add(a1, d1);*/// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化1、Add(a1, (int)d1);2、Add<int>(a1, d1);return 0; }

二、类模板

类模板的格式:

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

类模板的实例化:

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>
中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

接下来我们实现一个具体的类

#define _CRT_SECURE_NO_WARNINGS 1
#define SEQLIST_DEFAULT_SIZE 8
#include<iostream>
#include<assert.h>
using namespace std;
template<typename Type>
class SeqList//此时写的类仅仅是一个模板,真正实例化对象才能有模板类
{public:bool IsFull(){return size >= capacity;}SeqList(int sz)//构造函数{capacity = sz > SEQLIST_DEFAULT_SIZE ? sz : SEQLIST_DEFAULT_SIZE;Type *base = new Type[SEQLIST_DEFAULT_SIZE];assert(base != NULL);size = 0;}~SeqList(){delete []base;base = nullptr;capacity = size = 0;}void push back(const Type &x);//成员函数想在类外实现需要有以下格式:
private:ElemType *base;size_t capacity;size_t size;
};
template<class Type>
SeqList<Type>::push back(const Type &x)
{assert(!IsFull());
}
void main()
{SeqList<int > mylist(10);SeqList<char>youlist(7);
}

template(模板)的介绍以及使用方法相关推荐

  1. php中template函数,thinkPHP模板中函数的使用方法

    这篇文章主要介绍了thinkPHP模板中函数的使用方法,结合实例形式对比分析了php函数的单独使用与thinkPHP模板中php函数的相应使用技巧,需要的朋友可以参考下 1.php中的方法使用 $va ...

  2. JavaScript模板字面量(Template literals)介绍

    JavaScript模板字面量(Template literals)介绍 模板字面量(Template literals)是什么? 简单地说,是允许嵌入表达式的字符串字面量.在反引号中可以直接使用单引 ...

  3. template 模板是怎样通过 Compile 编译的

    template 模板是怎样通过 Compile 编译的 Compile compile 编译可以分成 parse.optimize 与 generate 三个阶段,最终需要得到 render fun ...

  4. template模板函数

    template模板 一个简单的字符串模板 var template = (function() { var cache = {};return function(obj, str) {if (!ty ...

  5. 【Aegisub相关】VSCode插件:Aegisub Helper的安装、功能介绍及使用方法

    原作者插件的开源链接: https://github.com/DCTewi/Aegisub-Helper 附上横行写法文件的压缩包: Aegisub Helper 标准模板示例(含使用教程) 题外话: ...

  6. 工厂+模板模式介绍及实战

    工厂+模板模式介绍及实战 1.设计模式介绍 1.1.工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

  7. Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍、使用方法之详细攻略

    Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍.使用方法之详细攻略 目录 常见各种文件格式后缀介绍 .pyc文件介绍 .py文件介绍 .pxd 文件 .pyd 文件 ...

  8. 第六章-template模板

    第六章-template模板 文章目录 第六章-template模板 函数模板 类模板 函数模板 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计 函数定义的 ...

  9. 【小白学习C++ 教程】十五、C++ 中的template模板和泛型

    @Author:Runsen template模板在 C++ 中一个简单但非常强大的工具.简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码. C++ 添加了两个新关键 ...

  10. php smarty模板配置,Smarty模板简单配置与使用方法示例

    这篇文章主要介绍了Smarty模板简单配置与使用方法,涉及Smarty模板的基本配置与缓存文件的相关使用技巧,需要的朋友可以参考下 本文实例讲述了Smarty模板简单配置与使用方法.分享给大家供大家参 ...

最新文章

  1. nginx telnet sshd
  2. python人工智能-Python在人工智能中的作用
  3. Re: Programming C/C++中extern C含义深层探索
  4. 【PAT乙级】1080 MOOC期终成绩 (25 分)
  5. JVM监控-命令行篇
  6. Linux 常用命令笔记 (持续更新)
  7. Pattern-No.07 设计模式之单例模式
  8. 点击SAP Fiori Launchpad某个tile后遇到的错误消息如何解决
  9. ARM 移植 PPPD
  10. Cloud一分钟 |高通预在年底与苹果和解;比特币绝地反弹;广电拿下5G,或成第四大运营商...
  11. 腾讯视频怎样关闭推送迷你页面
  12. vagrant up 慢的解决方案
  13. javascript设计模式——Module
  14. python 虚拟环境 windows_Python虚拟环境(Windows版)
  15. Extjs之EditorGridPanel的beforeedit事件参数
  16. Java 入门之6:Java中的char类型是怎么存储的以及常见的编码字符集
  17. github加速方法
  18. 桩身弹性压缩计算公式_压缩弹簧弹力的计算公式
  19. 【后缀数组+???】BZOJ3654 图样图森破
  20. Linux系统管理干货总结笔记

热门文章

  1. 燕山大学大物实验下线上版
  2. 一根木棒折两次形成一个三角形的概率是多少
  3. redis命中率不高问题排查
  4. html+css响应式旅游主题网站模板,旅游网站,企业文化新闻类网站,简单web假期课程作业
  5. linux 游戏引擎库,用C++实现跨平台游戏引擎开发
  6. c语言算正方形面积和周长,c语言中编写一程序计算正方形的周长和面积
  7. 顶点计划:996问题讨论
  8. 绑定ZBar的OpenCV条形码和QR码扫描器
  9. 上拉(Pull Up )或下拉(Pull Down)电阻详解
  10. CSS垂直居中和水平居中