C++之模板

在C++ 中,模板为泛型程序设计奠定了关键的基础。使用模板需要用到两个关键字template 、typename,写法:template<typename Type>   template告诉编译器,将要定义一个模板,<>中的是模板参数列表,类似于函数的参数列表,关键字typename看作是变量的类型名,该变量接受类型作为其值,把Type看作是该变量的名称,是一个通用的类型。

函数模板

1.常规使用

建立一个通用函数模板,它所用到的数据的类型(包括返回值类型、形参类型、函数体中局部变量类型)用一个虚拟的类型(模板类型)来代替,而实际调用时编译器根据传入的实参来逆推出真正的类型,生成对应的具体的函数。这样一个通用的模板函数不仅将数据的值作为变化的量,类型也被参数化。
两个关键字:template:定义模板的关键字;typename :定义模板类型的关键字

其中T是模板参数,虚拟的类型,用于替换。在实际调用时,实参为int类型,那么会生成一个参数和返回值都为int类型的函数,由一个通用的模板函数生成具体类型的函数。编译器由函数模板自动生成模板函数的过程叫模板的实例化。

2.显示指定及默认值

如果函数的参数中并未使用模板类型,那么编译器无法自动推导,这时就需要手动的显示指定模板类型。

#include<iostream>
using namespace std;template<typename T>
void fun()
{T t = 0;cout << typeid(t).name() << endl; //输出变量的类型
}
int main()
{//在调用函数时,显式的指定fun<long>(); //此时模板类型T为"long"类型return 0;
}

 除此之外还可以指定模板类型的默认类型(类似于函数参数指定默认值)

template<typename T = long>
void fun()
{T t = 0;cout << typeid(t).name() << endl; //输出变量的类型
}
int main()
{fun();return 0;
}

模版参数类型选择的优先级:手动显示指定>编译器根据实参自动推导>模板类型默认值

示例代码:

#include<iostream>
using namespace std;template<typename T = long>
void fun(T t)
{cout << typeid(t).name() << endl; //输出变量的类型
}
int main()
{double a = 3.14;fun(a); //doublefun<char>(a); //char
}

3.多模板参数

类似于函数参数,模板类型可以指定多个,用逗号分割,每个模板类型都需要关键字typename修饰。template<typename T,typename K>   模板类型T替换一种类型,K则可以替换为另一种类型。多模板参数同样可以根据实参进行自动推导。不同于函数参数的默认值(从右向左依次指定,不能有间断),模板参数默认值指定的顺序可以是任意的没有强制的顺序要求,但在调用函数时显式指定模板类型时必须从左向右依次指定,不能有间断。

经验:编译器能够自动推导出来的模板参数放于最后,剩余的模板参数如果有默认值的放于中间,无默认值则放于前面。

例:

template<typename T, typename K = long, typename M>
void fun(M &m);fun<double>(10); //fun<double,long,int>
fun<double, char>(10); //fun<double,char,int>

4.模板函数的声明和定义

如果函数的声明和定义分开,那么在声明和定义处都需要加上模板,如果模板存在默认类型,那么只在函数声明时指定即可。

由于模板函数的定义并不是真正的函数,他们不能单独编译,所以不能将模板函数单独放到源文件中,模板必须与特定的模板实例化请求一起使用,所以最好的办法是模板函数的声明和定义放在一起。

类模板

与函数模板差不多,类模板也需要在类定义的上面加上template typename但在定义对象时,必须使用<>显式的指定模板类型

模板类型可以替换类内的任意地方定义的类型,包括成员属性类型,成员函数。
类中成员属性若为模板类型,那么我们可以定义带参数的构造,让调用者去指定初始化值。
类模板可以有多个模板类型,且可以指定默认的模板参数,规则是从右往左依次指定不能间断(从后往前),在定义对象时从左向右指定,如果不指定模板参数,将使用默认的。

如果模板类中的成员函数在类中声明,类外实现时,函数的定义处也要加上模板,如下:

如果类模板指定了默认的类型,为了避免歧义,默认的模板类型应当去掉。
如果在模板类中声明、类外定义的成员函数存在函数模板,那么在定义的时候,两个模板都需要指定。如下:

注:这种情况下,顺序为:先类模板,后函数模板
模板类中嵌套的情况:

#define _CRT_SECURE_NO_WARNINGS#include<iostream>
using namespace std;template<typename T>
class A{
public:T m_t;A(){m_t = 10;}A(T t) {m_t = t;}
};
class B {
public:A<long>m_a;B() {}B(long a) :m_a(a) {}
};template<typename T>
class C {
public:A<T>m_a;C(T a) :m_a(a) {}
};template<typename K>
class D {
public:K m_k;D(const K k) :m_k(k) {}
};int main()
{B b;cout << b.m_a.m_t << endl;  //10B b2(30);cout << b2.m_a.m_t << endl; //30C<char>c('a');cout << c.m_a.m_t << endl;  //aA<double>aa(12.3);D<A<double>>d(aa);cout << d.m_k.m_t << endl; //12.3
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349879.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AGI 远不止 ChatGPT!一文入门 AGI 通识及应用开发

AI 大语言模型进入爆发阶段 2022 年 12 月 ChatGPT 突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&am…

禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作

方案一&#xff1a; 下载火绒杀毒&#xff0c;在联网请求上禁用Adobe软件的联网请求&#xff0c;甚至还可以额外发现哪些是它要想要偷偷摸摸干的。 方案二&#xff1a; 最后注意&#xff1a; 用盗版软件只是获得了使用权&#xff01;

关于element-plus中el-select自定义标签及样式的问题

关于element-plus中el-select自定义标签及样式的问题 我这天天的都遇到各种坑&#xff0c;关于自定义&#xff0c;我直接复制粘贴代码都实现不了&#xff0c;研究了一下午&#xff0c;骂骂咧咧了一下午&#xff0c;服气了。官网代码实现不了&#xff0c;就只能 “ 曲线救国 ”…

Kubernetes集群持久化部署实践

WordPress 网站持久化部署 要持久化MariaDB 可以把 Deployment 改成了 StatefulSet&#xff0c;修改 YAML添加“serviceName”“volumeClaimTemplates”这两个字段&#xff0c;定义网络标识和 NFS 动态存储卷&#xff0c;然后在容器部分用“volumeMounts”挂载到容器里的数据目…

php实现一个简单的MySQL分页

一、案例演示&#xff1a; 二、php 代码 <?php $servername "localhost"; // MySQL服务器名称或IP地址 $username "root"; // MySQL用户名 $password "123456"; // MySQL密码 $dbname "test"; // 要连接…

Character Region Awareness for Text Detection论文学习

​1.首先将模型在Synth80k数据集上训练 Synth80k数据集是合成数据集&#xff0c;里面标注是使用单个字符的标注的&#xff0c;也就是这篇文章作者想要的标注的样子&#xff0c;但是大多数数据集是成堆标注的&#xff0c;也就是每行或者一堆字体被整体标注出来&#xff0c;作者…

泛微开发修炼之旅--15后端开发连接外部数据源,实现在ecology系统中查询其他异构系统数据库得示例和源码

文章链接&#xff1a;15后端开发连接外部数据源&#xff0c;实现在ecology系统中查询其他异构系统数据库得示例和源码

大模型应用产品指北

一、试用类型 计算机视觉Computer Vision&#xff1a;Text-to-image(文生图) 二、国内产品 Aliyun通义千问 【体验】 可以替代Stable Diffusion、Midjourney;支持风格、滤镜; [传送门&#xff1a;通义万相] 【体验】Transformer架构&#xff1b;中英双语&#xff1b;开源可以…

CentOS7安装nginx【巨详细】

CentOS7安装nginx 安装依赖 1.安装gcc&#xff0c;nginx 编译时依赖 gcc 环境 # 安装c yum install gcc-c# 查看版本 gcc -v正常情况显示如下 2.安装openssl 安全套接字层密码库&#xff0c;用于通信加密 yum install -y openssl openssl-devel3.安装zlib,zlib 库 提供了很多…

Java基础面试重点-1

0. 符号&#xff1a; *&#xff1a;记忆模糊&#xff0c;验证后特别标注的知识点。 &&#xff1a;容易忘记知识点。 *&#xff1a;重要的知识点。 1. 简述一下Java面向对象的基本特征&#xff08;四个&#xff09;&#xff0c;以及你自己的应用&#xff1f; 抽象&#…

git提交错了?别慌,直接删除提交记录

git revert 和git reset &#xff01;这两个命令都有撤销操作的功能&#xff01;哪一个可以删除提提交记录&#xff1f;&#xff1f;&#xff1f; 使用git revert撤销提交 revert的英文释义是回复、恢复&#xff08;到原来的状态&#xff09; 作用 git revert 是 Git 中用于撤…

WordPress如何删除内存中的缓存?

今天boke112百科将某篇文章修改分类和内容更新后&#xff0c;发现文章底部的相关文章显示的内容跟文章分类、标签毫无关系&#xff0c;还是显示原来的旧内容。后来查看YIA主题相关文章的代码&#xff0c;才发现相关文章的数据保存到内存中的&#xff0c;而且是永不过期&#xf…

深入理解计算机系统 家庭作业6.22

每条磁道存 位 有r-xr条磁道 二者相乘就是我们要求的容量) 所以最大值x0.5

问题(05)elementui 输入框里面禁止浏览器自动填充用户名密码、弹出浏览器历史密码提示框

问题描述 el-input&#xff0c;非密码框&#xff0c;在输入时&#xff0c; 问题1&#xff1a; 浏览器自动填充用户名密码。问题2&#xff1a;右边显示浏览器历史密码提示框。 问题解决 问题1&#xff1a;使用auto-complete"new-password" <input type"te…

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

计算机网络(6) UDP协议

一.UDP数据报格式 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种简单的传输层协议&#xff0c;与TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;UDP提供一种无连接、不可靠的数据传…

深入解析Prometheus:强大的开源监控与告警系统

目录 引言 一、运维监控平台的设计思路 &#xff08;一&#xff09;设计思路 1.数据收集模块 2.数据提取模块 3.监控告警模块 &#xff08;二&#xff09;监控平台层级 二、Prometheus简介 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;核心特征 …

byzer 笔记总结

1.总览&#xff08;简单了解&#xff09; 1.1 数据挖掘的定义 基于大数据技术&#xff0c;针对有价值是业务场景&#xff0c;对数据中台沉淀的大量数据进行探索&#xff0c;分析。寻找数据与数据之间潜藏的关系&#xff0c;转化为自动化的算法模型&#xff0c;从而获取有价值的…

el-table 多选回显,分页回显

实现el-table多选分页回显功能&#xff0c;左侧是分页的数据源&#xff0c;右侧是选择后的人员数据&#xff0c;切换下一页&#xff0c;选中的数据会在左侧表格回显。 实现&#xff1a; <template><el-dialog :title"title" :visible.sync"show"…

如何将ai集成到项目中,方法二

上一篇文章&#xff1a;如何将ai集成到radsystems项目中&#xff0c;在项目中引入ai-CSDN博客 上一篇文章内容主要针对于未实现权限分离的项目&#xff0c;这篇文章主要来说一下权限分离的项目怎么做&#xff0c;以及注意的细节。 一、编写前端router.js 二、编写前端askai.vu…