C++ 模板

模板:

        模板,即数据是灵魂,其余为肉身,正所谓有趣的灵魂万里挑一,所以想要模板变得完美,关键在于数据;其余不过是抄作业的框架。

模板函数:

        模板函数可以自动推导出你传给他的数据类型,同时也可以指定数据类型;但自定义的class在做相应的运算则需要对操作符进行重载。

#include <iostream>
#include <string>using namespace std;template <typename T1,typename T2,typename T3>T1 add(T1 a,T2 b,T3 c)
{cout<<"T1"<<endl;return a+b+c;
}int main(int argc, char const *argv[])
{int a=10;float b=8.123;short c=12;cout<<add(a,'a',c)<<endl;//自动推导cout<<add<int,short,int>(a,b,c)<<endl;//手动指定参数类型return 0;
}

        模板函数与普通函数       

                 当模板函数遇上普通函数重载时,按类型匹配高的来。

#include <iostream>
#include <string>using namespace std;template <typename T, typename T1>void myswap(T &a, T1 &b) // 自动推导出传入的数据类型
{T temp;temp = a;a = b;b = temp;cout << "模板函数" << endl;
}void myswap(int &a, int &b)
{int temp = a;a = b;b = temp;cout << "普通函数" << endl;
}
int main(int argc, char const *argv[])
{int a = 10;int b = 20;myswap(a, b);cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "-------------" << endl;float c = 10.5;float d = 20.5;myswap(c, d);cout << "c=" << c << endl;cout << "d=" << d << endl;cout << "-------------" << endl;int e = 10;float f = 13.35;myswap(f, e);cout << "e=" << e << endl;cout << "f=" << f << endl;cout << "-------------" << endl;return 0;
}

   自定义数据类型给模板函数传参

         自定义的数据成为模板函数的参数时参与运算时,需要自行重载操作符,否则会报错。

#include <iostream>
using namespace std;template <class T>
bool isBig(T a, T b)
{if (a > b){return true;}else{return false;}
}// 定义用户自定义数据类型
class base
{
public:base(int v) : value(v) {}private:int value;bool friend operator>(base a, base b);
};bool operator>(base a, base b)
{return a.value > b.value;
}int main()
{// 基本的数据类型// int a = 10;// int b = 20;base a(10);base b(20);if (isBig(a, b)){cout << "a is bigger than b" << endl;}else{cout << "b is bigger than a" << endl;}
}

模板类:

        模板类构造

        必须手动指明参数类型。

#include <iostream>
#include <string>
using namespace std;template <class T, class T1, class T2>class student
{
private:T name;T1 id;T2 number;public:student(T name, T1 id, T2 number) : id(id), number(number), name(name){}void show(){cout << "name=" << name << endl;cout << "id=" << id << endl;cout << "number=" << number << endl;cout<<"---------------------------"<<endl;}
};
int main(int argc, char const *argv[])
{student<string, int, int> stu("张三", 2301956, 1346545);stu.show();student<string, string, string> tech("李四", "老师", "物理");tech.show();return 0;
}

        模板类传参

        模板是无法进行直接传参的,但可以通过特殊方式进行传参

                1、指定实例化类型

                2、将需要实例化的数据类型继续模板化

                3、直接将函数接口改为模板函数

        

#include <iostream>
using namespace std;template <class T>
class base // 定义一个模板类
{
public:T a;
};// 1.把模板类的类型 ,实例化
void set_base(base<int> &tmp, int v)
{tmp.a = v;
}void show_base(base<int> &tmp)
{cout << tmp.a << endl;
}// 2.把模板类的类型,继续模板化
template <class T>
void set_base(base<T> &tmp, T v)
{cout << "继续模板化" << endl;tmp.a = v;
}template <class T>
void show_base(base<T> &tmp)
{cout << "继续模板化" << endl;cout << tmp.a << endl;
}// 3.直接定义模板函数
template <class T, class T1>
void set_base(T &tmp, T1 v)
{tmp.a = v;
}template <class T>
void show_base(T &tmp)
{cout << tmp.a << endl;
}int main()
{base<int> tmp;set_base(tmp, 100);show_base(tmp);
}

模板类的继承

        模板类因为数据类型不确定,也无法直接继承,也需要特殊的改造;

              方法一、 指定模板数据类型,其子类回归普通类。

              方法二、将数据类型继续模板化,但其子类属性依然是模板类

#include <iostream>
using namespace std;
// 模板基类
template <class T>
class base
{
public:base() {}base(T v) : data(v) {}void show(){cout << this->data << endl;}private:T data;
};// 1.指定基类的模板类   类型  -> 已经不是模板类
class xbase : public base<int>
{
};// 2.继续把基类的类型  模板化 -> 派生类还是模板类
template <class T>
class xbase2 : public base<T>
{
};int main()
{xbase tmp;xbase2<int> tmp2;
}

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

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

相关文章

便捷高效的电能管理:利用PLC远程控制网关实时监控配电箱

配电箱是工业生产过程中必不可少的设备&#xff0c;其中的PLC&#xff08;可编程逻辑控制器&#xff09;是实现自动化控制的重要组成部分。为了实时监控配电箱的数据&#xff0c;并进行远程调试上下载与管理控制&#xff0c;我们可以使用PLC数据采集与远程控制网关。 PLC数据采…

2023年全国大学生数学建模B题

多波束测线问题 1.问题提出 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff0c;并记录从声波发射到信号接…

CVE-2023-3836:大华智慧园区综合管理平台任意文件上传漏洞复现

文章目录 CVE-2023-3836&#xff1a;大华智慧园区综合管理平台任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 CVE-2023-3836&#xff1a;大华智慧园区综合管理平台任意文件上传漏洞复现 0x01 前言 免责声…

0012Java程序设计-springboot基于微信小程序的校园智慧帮系统的设计与实现

摘要目录相关技术2.1 MySQL数据库2.2 SpringBoot框架2.3 uniapp框架2.4 B/S架构 系统设计系统实现开发环境 摘要 随着移动互联网高速发展&#xff0c;手机、移动智能终端设备在生活中有着越来越重要的地位。在高校推崇以人为本的今天&#xff0c;也逐渐重视“移动互联网”技术…

Java“牵手”1688商品详情数据,1688商品详情API接口,1688API接口申请指南

1688平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…

一套成熟的实验室信息管理系统(云LIS源码)ASP.NET CORE

一套成熟的实验室信息管理系统&#xff0c;集前处理、检验、报告、质控、统计分析、两癌等模块为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通过计算机联…

CSS中如何实现文字渐变色效果(Text Gradient Color)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字渐变色效果&#xff08;Text Gradient Color&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

2023国赛数学建模C题思路模型 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

前端面试的话术集锦第 8 篇:高频考点(JS性能优化 性能优化琐碎事)

这是记录前端面试的话术集锦第八篇博文——高频考点(JS性能优化 & 性能优化琐碎事),我会不断更新该博文。❗❗❗ 1. 从V8中看JS性能优化 注意:该知识点属于性能优化领域。 1.1 测试性能⼯具 Chrome已经提供了⼀个⼤⽽全的性能测试⼯具Audits。 点我们点击Audits后,可…

【Git】01-Git基础

文章目录 Git基础1. 简述1.1 版本管理演变1.2 Git的特点 2. Git安装2.1 安装文档2.1 配置user信息 3. 创建仓库3.1 场景3.2 暂存区和工作区 4. 重命名5. 常用git log版本历史5.1 查看当前分支日志5.2 简洁查看日志5.3 查看最近指定条数的日志 6. 通过图形界面工具查看版本7. 探…

数据库-DQL

DQL&#xff1a;用来查询数据库表中的记录 关键字&#xff1a;SELECT 语法&#xff1a; select&#xff1a;字段列表 from&#xff1a;表名列表 where&#xff1a;条件列表 group by&#xff1a;分组列表 having&#xff1a;分组后条件列表 order by&#xff1a;排序字段列表…

UWB学习——day1

UWB定义 UWB&#xff1a;Ultra Wideband&#xff08;超宽频&#xff09; UWB所谓的超宽频区别于其它近场通信技术可总结为时域上跳跃&#xff0c;频域上矮胖 从图中可以看出&#xff0c;时域上通过短且强的脉冲信号&#xff0c;频域上主要是超宽的频谱&#xff08;Spectrum&a…

VsCode备忘

上次简单学习了一下vscode的使用&#xff0c;结果好长时间没用&#xff0c;今天打开又全忘了。。。再记录一下吧 快捷键 CtrlShiftP 命令面板&#xff0c;查找命令&#xff0c;设置等等 Ctrl 打开集成终端&#xff0c;监视生成输出 Ctrl, 打开设置 CtrlP 转到文件,使用转到符…

CSAPP的Lab学习——Archlab(Architecture Lab)

文章目录 前言一、A部分sum .ys&#xff1a;迭代求和链表元素写一个Y86-64的程序和。rsum .递归求和链表元素copy.ys 复制将源块复制到目标块 二、B部分三、C部分实现iaddq指令 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。刚刚看完CSAPP&#xff0c;真是一本神…

ansible搭建

一&#xff0c;ansible是一种由Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能 二&#xff0c;特点 * 部署简单 * **默认…

【网络通信 -- WebRTC】Open WebRTC Toolkit 环境搭建指南

【网络通信 -- WebRTC】Open WebRTC Toolkit -- OWT-Server 编译安装指南 【1】OWT Server 与 Web Demo 视频会议环境搭建 【1.1】编译 OWT Server 安装依赖 ./scripts/installDepsUnattended.sh编译 scripts/build.js -t all --check 注意若不支持硬件加速则采用如下命令 s…

Android发布依赖到 Jitpack

前言 我们在日常开发中&#xff0c;经常会用到第三方开源的库文件&#xff0c;有的来自JCenter&#xff0c;Maven Central&#xff0c;google等。但是随着JCenter的弃用&#xff0c;现在用的最多的还是Maven Central&#xff0c;google。今天我们就自己亲自发布一个依赖。 现…

企业架构LNMP学习笔记20

Nginx Location匹配规则&#xff1a; URI&#xff1a;统一资源标识符。 URN&#xff1a;统一资源名称。 URL&#xff1a;统一资源定位符。URL是更细化一点。 1&#xff09;精确匹配&#xff1a; location / {#规则 } 则匹配到 Example Domain 这种请求。 2&#xff09;~ 大…

ubuntu上ffmpeg使用framebuffer显示video

这个主题是想验证使用fbdev(Linux framebuffer device&#xff09;&#xff0c;将video直接显示到Linux framebuffer上&#xff0c;在FFmpeg中对应的FFOutputFormat 就是ff_fbdev_muxer。 const FFOutputFormat ff_fbdev_muxer {.p.name "fbdev",.p.long_…

Visual Studio(2022)生成链接过程的.map映射文件以及.map映射文件的内容说明

微软的官方说明 /MAP&#xff08;生成映射文件&#xff09; | Microsoft Learn 设置步骤 1. 右键项目属性, 连接器 -> 常规 -> 启用增量链接&#xff0c;设置为否。如下图&#xff1a; 2. 连接器 -> 调试 生成调试信息 设置为 生成调试信息 (/DEBUG) 生成程序数据库…