iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >[C++] 模板template
  • 588
分享到

[C++] 模板template

c++开发语言 2023-09-02 14:09:35 588人浏览 独家记忆
摘要

  目录 1、函数模板 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.4.1 隐式实例化 1.4.2 显式实例化 1.5 模板参数的匹配原则 2、类模板 2.1 类模板的定义格式 2.2

 

目录

1、函数模板

1.1 函数模板概念

1.2 函数模板格式

1.3 函数模板的原理

1.4 函数模板的实例化

1.4.1 隐式实例化

1.4.2 显式实例化

1.5 模板参数的匹配原则

2、类模板

2.1 类模板的定义格式

2.2 类模板的实例化


讲模板之前呢,我们先来谈谈泛型编程

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
模板分为两类:函数模板与类模板

1、函数模板

1.1 函数模板概念

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

1.2 函数模板格式

template
返回值类型 函数名(参数列表){}

//templatetemplatevoid Swap(T& left, T& right){    T tmp = left;    left = right;    right = tmp;}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class) 。

1.3 函数模板的原理

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

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

1.4 函数模板的实例化

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

1.4.1 隐式实例化

隐式实例化是让编译器根据实参推演模板参数的实际类型

templateT 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);        return 0;}

这里Add(a1, a2)与Add(d1, d2)都是隐式实例化,编译器会根据实参推出实际类型。

我们再来看一段代码:

templateT Add(const T& left, const T& right){return left + right;}int main(){int i = 1;double d = 1.1;Add(i, d);return 0;}

该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参i将T推演为int,通过实参d将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。

注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅Add(i, d);

这里要解决这样的问题有两种方式:

1. 用户自己来强制转化;

2. 使用显式实例化。

int main(){int i = 1;double d = 1.1;Add(i, (int)d);return 0;}

1.4.2 显式实例化

显式实例化是在函数名后的<>中指定模板参数的实际类型

templateT Add(const T& left, const T& right){return left + right;}int main(){int i = 1;double d = 1.1;Add(i, d);// 显式实例化为intAdd(i, d);// 显示实例化为doublereturn 0;}

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

1.5 模板参数的匹配原则

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

// 专门处理int的加法函数int Add(int left, int right){return left + right;}// 通用加法函数templateT Add(T left, T right){return left + right;}void Test(){Add(1, 2); // 与非模板函数匹配,编译器不需要特化Add(1, 2); // 调用编译器特化的Add版本}

2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

// 专门处理int的加法函数int Add(int left, int right){return left + right;}// 通用加法函数templateT1 Add(T1 left, T2 right){return left + right;}void Test(){Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数 }

3. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

2、类模板

2.1 类模板的定义格式

templateclass 类模板名{// 类内成员定义};
templateclass stack{public:stack();//声明,在类外面定义~stack(){delete[] _a;_top = _capacity = 0;}private:T* _a;int _top;int _capacity;};// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表templatestack::stack(): _a(nullptr), _top(0), _capacity(0){}

2.2 类模板的实例化

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

int main(){stack st1;stack st2;return 0;}

如果我们的栈是要存储int类型的数据,我们就实例化为int,如果是存储char类型的数据,就实例化为char类型。

来源地址:https://blog.csdn.net/Ljy_cx_21_4_3/article/details/132282805

--结束END--

本文标题: [C++] 模板template

本文链接: https://www.lsjlt.com/news/390954.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • [C++] 模板template
      目录 1、函数模板 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.4.1 隐式实例化 1.4.2 显式实例化 1.5 模板参数的匹配原则 2、类模板 2.1 类模板的定义格式 2.2...
    99+
    2023-09-02
    c++ 开发语言
  • C++模板template原理解析
    目录前言1. 函数模板1.1函数模板的概念1.2函数模板的格式1.3 函数模板的原理1.4 函数模板的实例化1.4.1 隐式实例化1.4.2 显式实例化1.5 模...
    99+
    2024-04-02
  • C++模板Template详解及其作用介绍
    目录1. 模板2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6声明定义分离3. 类模板3.1 类模板...
    99+
    2024-04-02
  • C++中模板(Template)详解及其作用介绍
    目录概述函数模板类模板模板类外定义成员函数类库模板抽象和实例概述 模板可以帮助我们提高代码的可用性, 可以帮助我们减少开发的代码量和工作量. 函数模板 函数模板 (Function...
    99+
    2024-04-02
  • Go模板template用法详解
    本文只介绍template的语法和用法,关于template包的函数、方法、template的结构和原理,见:深入解析Go template模板使用详解。 入门示例 以下为test....
    99+
    2024-04-02
  • Vue2模板template的写法有哪些
    小编给大家分享一下Vue2模板template的写法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如下所示:<div...
    99+
    2024-04-02
  • vue-admin-template模板添加tagsview的实现
    目录一、从vue-element-admin复制文件二、修改 vue-admin-template\src\layout\components\AppMain.vue三、修改vue-...
    99+
    2024-04-02
  • 微信小程序模板template怎么用
    这篇文章将为大家详细讲解有关微信小程序模板template怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下效果图以MUI的实例首页和列表页面为实例 通过上...
    99+
    2024-04-02
  • 设计模式二十三:模板方法模式(Template Method Pattern)
    定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求 模版方法使用场景 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现...
    99+
    2023-08-30
    设计模式 模板方法模式
  • 微信小程序如何实现template模板
    小编给大家分享一下微信小程序如何实现template模板,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!微信小程序template模板使用前言微信小程序中提供了template使用,即相同的...
    99+
    2024-04-02
  • C++详解非类型模板参数Nontype与Template及Parameters的使用
    目录非类型类模板参数非类型函数模板参数非类型模板参数的限制非类型模板参数 auto非类型类模板参数 前一章使用的例子 Stack 使用的是标准库中的容器管理元素,也可以使用固定大小的...
    99+
    2024-04-02
  • .Net行为型设计模式之模板方法模式(Template Method)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、模板方法模式的具体实现六、模板方法模式的实现要点:1、模板方法模式适用情形:2、模板方法模式特点:...
    99+
    2024-04-02
  • 微信小程序如何使用template模板
    这篇文章给大家分享的是有关微信小程序如何使用template模板的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序 template模板详解及实例首先看一些官方的一些介绍。...
    99+
    2024-04-02
  • JS中art-template模板使用过滤器问题
    目录art-template模板使用过滤器举个栗子效果图art-template过滤器(单值,多值)art-template过滤器art-template模板使用过滤器 html有个...
    99+
    2024-04-02
  • 微信小程序中template模板有什么用
    这篇文章主要介绍了微信小程序中template模板有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信小程序 template模板详解...
    99+
    2024-04-02
  • vue2.6.10+vite2开启template模板动态编译的过程
    在从vue-cli迁移到vite2的时候,之前在代码中使用的模板编译遇到了问题: 我在项目中会根据后台返回的内容动态渲染,如果返回内容中有<el-image>等标签,v-...
    99+
    2023-02-03
    vue开启template模板动态编译 vue template模板编译 vue vite动态编译
  • 微信小程序如何引用视图template模板
    这篇文章将为大家详细讲解有关微信小程序如何引用视图template模板,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信小程序视图template模板引用的实例详解WXM...
    99+
    2024-04-02
  • JS中的art-template模板如何使用if判断
    目录JS art-template模板使用if判断模板引擎art-template的基本使用一、输出数据二、if判断语句三、for循环语句四、子模板JS art-template模板...
    99+
    2024-04-02
  • Angular模板中ng-template和ng-container指令的用法
    这篇文章主要讲解了“Angular模板中ng-template和ng-container指令的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angula...
    99+
    2024-04-02
  • vue中template模板编译的过程全面剖析
    目录简述过程vue的渲染过程parseparse过程总结generate生成render函数简述过程 vue template模板编译的过程经过parse()生成ast(抽象语法树)...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作