CPP语法(六)——函数模板

CPP语法 六—函数模板

    • 一、 模板
      • 1.1 函数模板
      • 1.2 重载函数模板
      • 1.3 类模板
        • 1.3.1 简单类模板
        • 1.3.2 默认模板参数
        • 1.3.3 为具体类型的参数提供默认值
        • 1.3.4 有界数组模板
      • 1.4 模板的使用
        • 1.4.1 定制模板类
        • 1.4.2 定制类模板成员函数

一、 模板

模板是c++的高级特性,分为函数模板和类模板。标准模板库(STL)

模板只作用于其下方的类或函数

1.1 函数模板

函数模板定义

template <类型形式参数表> 返回类型 函数名(形式参数表)
{...  //函数体
}template <class T>
void fun(T t)
{...		//函数实现
}template <class type>
type Sum(type xvar,type yvar)
{return xvar + yvar;
}//隐式
int result = Sum(10,20);
doouble result = Sum(10.0,20.0);//显示
int result = Sum<int>(10,20);
double result = Sum<double>(10.0,20.0);如果两个参数类型不一样,会报错

template 为关键字,表示定义一个模板,尖括号<>表示模板参数。

模板参数主要有两种:一种是模板类型参数,另一种是模板非类型参数。

1.2 重载函数模板

整型数和浮点数编译器可以直接比较,所以使用函数模板也能直接比较。

#include <iostream >
#include <string >
using namespace std;
template<class Type>
Type min(Type a,Type b)//定义函数模板
{if(a < b)return a;elsereturn b;
}
char * min(char * a,char * b)// 重载函数模板
{if(strcmp(a,b))return b;else return a;
}
void main ()
{cout << "最小值:" << min(10,1) << endl;cout << "最小值:" << min('a','b') << endl;cout << "最小值:" << min("hi","mr") << endl;
}

1.3 类模板

类模板代表一族类,是用来描述通用数据类型或处理方法的机制,它使类中的数据成员和成员函数的参数或返回值可以取任意数据类型。类模板可以说是用类生成类,减少类的定义数量。

类模板声明:

template <类型形式参数表> class 类模板名
{...		//类模板体
};

类模板成员函数定义:

template <类型形式参数表>
返回类型 类模板名 <类型名>::成员函数名(形式参数列表)
{... //函数体
}

其中类型形式参数表中的 参数也可以是其他模板。

template <template <class A> class B>
class cBase
{private:B<int> m_n;
}

类模板也可以继承:

template <class T>
class CDerived public T
{public:CDrived();
};
template <class T>
CDerived<T>::CDerived():T()
{cout<<""<<endl;
}
void main()
{CDerived<CBase1> D1;CDerived<CBase1> D1;
}
1.3.1 简单类模板
#include <iostream>
using namespace std;
template<class T1,class T2>
class MyTemplate
{T1 t1;T2 t2;public:MyTemplate(T1 tt1,T2 tt2){t1 =tt1, t2=tt2;}void display(){ cout << t1 << ' ' << t2 << endl;}
};
void main()
{int a=123;double b=3.1415;MyTemplate<int ,double> mt(a,b);mt.display();
}
1.3.2 默认模板参数
#include <iostream>
using namespace std;
template <class T1,class T2 = int>
class MyTemplate
{T1 t1;T2 t2;
public:MyTemplate(T1 tt1,T2 tt2){t1=tt1;t2=tt2;}void display(){cout<< t1 << ' ' << t2 << endl;}
};
void main()
{int a=123;double b=3.1415;MyTemplate<int ,double> mt1(a,b);MyTemplate<int> mt2(a,b);mt1.display();mt2.display();
}
1.3.3 为具体类型的参数提供默认值
#include <iostream>
using namespace std;
template<class T1,class T2,int num= 10 >
class MyTemplate
{T1 t1;T2 t2;public:MyTemplate(T1 tt1,T2 tt2){t1 =tt1+num, t2=tt2+num;}void display(){ cout << t1 << ' ' << t2 <<endl;}
};
void main()
{int a=123;double b=3.1415;MyTemplate<int ,double> mt1(a,b);MyTemplate<int ,double ,100> mt2(a,b);mt1.display();mt2.display();
}
1.3.4 有界数组模板

在模板中想要获取下标值,需要重载数组下标运算符 [ ] ,然后使用模板类实例化数组,就可以进行下标越界检测。例如:

#include <cassert>
template <class T,int b>
class Array
{T& operator[](int sub){assert(sub >= 0 && sub < b);}
}

比较模板重载

#include "stdafx.h"
#include <iostream>/*定义一个能够求的模板函数,并重载该模板函数,使其可以比较字符串的大小。
*/using namespace std;template<class T>
T max(T a, T b) {return a>b?a:b;
}const char * max(const char *a, const char * b) {if(strcmp(a,b)){return b;}else {return a;}
}int main(int argc, char* argv[])
{cout << "最大值:" << max(10,1) << endl;cout << "最大值:" << max('a','b') << endl;cout << "最大值:" << max("hi","mr") << endl;return 0;
}

1.4 模板的使用

定义模板类后如果想扩展模板新类的功能,需要对类模板进行覆盖,使模板类能够完成特殊功能。覆盖操作可以针对整个类模板、部分类模板以及类模板的成员函数,这种覆盖操作称为定制。

1.4.1 定制模板类

定制一个类模板,覆盖类模板中定义的 所有 成员。

#include <iostream>
using namespace std;
class Date
{int iMonth,iDay,iYear;char Format[128];
public:Date(int m=0,int d=0,int y=0){iMonth=m;iDay=d;iYear=y;}friend ostream& operator<<(ostream& os,const Date t){cout << "Month: " << t.iMonth << ' ' ;cout << "Day: " << t.iDay<< ' ';cout << "Year: " << t.iYear<< ' ' ;return os;}void Display(){cout << "Month: " << iMonth;cout << "Day: " << iDay;cout << "Year: " << iYear;cout << endl;}
};template <class T>
class Set
{T t;public:Set(T st) : t(st) {}void Display(){cout << t << endl;}
};
class Set<Date>
{Date t;
public:Set(Date st): t(st){}void Display(){cout << "Date :" << t << endl;}
};
void main()
{Set<int> intset(123);Set<Date> dt = Date(1,2,3);	//还可以写成这样 Set<Date> dt(Date(1,2,3));intset.Display();dt.Display();
}
1.4.2 定制类模板成员函数

定制一个类模板,覆盖类模板中指定的成员

#include <iostream>
using namespace std;
class Date
{int iMonth,iDay,iYear;char Format[128];
public:Date(int m=0,int d=0,int y=0){iMonth=m;iDay=d;iYear=y;}friend ostream& operator<<(ostream& os,const Date t){cout << "Month: " << t.iMonth << ' ' ;cout << "Day: " << t.iDay<< ' ';cout << "Year: " << t.iYear<< ' ' ;return os;}void Display(){cout << "Month: " << iMonth;cout << "Day: " << iDay;cout << "Year: " << iYear;cout << std::endl;}
};
template <class T>
class Set
{T t;public:Set(T st) : t(st) {}void Display();
};
template <class T>
void Set<T>::Display()
{cout << t << endl;
}
void Set<Date>::Display()
{cout << "Date: " << t << endl;
}
void main()
{Set<int> intset(123);Set<Date> dt =Date(1,2,3);intset.Display();dt.Display();
}

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

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

相关文章

【详细实现】v1.0 随机点名应用

1.引言 前面对这个应用的功能做了详细的分析&#xff08;长什么样、能干什么&#xff09;&#xff0c;以先这样对一个项目最开始的分析成为需求分析&#xff0c;需求分析之后就是设计阶段。 那么一般的项目&#xff0c;在设计阶段都需要干什么呢&#xff1f;在需求分析阶段确定…

Spring Cloud Eureka面试题

Spring Cloud Eureka面试题 1. Eureka基础概念1.1 什么是Eureka&#xff1f;1.2 Eureka的组件和架构有哪些元素组成&#xff1f;1.3 Eureka Server和Eureka Client有什么区别&#xff1f;1.4 如何描述Eureka的自我保护机制&#xff1f; 2. 服务注册与发现2.1 如何将服务注册到E…

[C++][算法基础]数字三角形(动态规划)

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 88 1 02 7 4 4 4 5 2 6 …

c++ 智能指针 交换函数实验

1.概要 c 智能指针 交换函数实验 交换后&#xff0c;两个指针管理的目标对象会发生交换 sh_ptr1.swap(sh_ptr2); 2.代码 #include <iostream> using namespace std;int main() {shared_ptr<int> sh_ptr1 std::make_shared<int>(5);shared_ptr<int>…

【c++基础】求细胞数量

说明 一矩形阵列由数字 0 到 9 组成&#xff0c;数字 1 到 99 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞&#xff0c;求给定矩形阵列的细胞个数。 输入数据 第一行两个整数代表矩阵大小 n 和 m。 接下来 n 行&#xff0c;每行一个长度…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时&#xff0c;这两个资源都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&…

华为 obs相关

obd配置 hw-obs:endpoint: ak: sk: bucketname:获取桶列表 public class HwObsController {Value("${hw-obs.ak}")private String hwObsAk;Value("${hw-obs.sk}")private String hwObsSk;Value("${hw-obs.endPoint}")private String hwObsEndp…

惯性测量单元(IMU)CAN接口:M-G552PJ7

M-G552PJ7是一种小形状因子惯性测量单元&#xff08;IMU&#xff09;&#xff0c;具有6个自由度&#xff1a;三轴角率和线性加速度&#xff0c;利用高精度补偿技术提供高稳定性和 高精度的测量能力。 各种校准参数存储在IMU的内存中&#xff0c;并在IMU的电源被打开后自动反映在…

python项目练习-1

获取无忧书城的小说内容&#xff01; import requests # 导入请求包 from lxml import etree # 导入处理xml数据包url https://www.51shucheng.net/wangluo/douluodalu/21750.html book_num 1 # 文章页数 download_urls [] # 定义一个空列表&#xff0c;表示我们下载过小…

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

关于bof-launcher bof-launcher是一款针对Beacon对象文件&#xff08;BOF&#xff09;的安全测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松在C/C/Zig应用程序中执行Beacon对象文件&#xff08;BOF&#xff09;。 Cobalt Strike 4.1于2020年6月25日发…

Checkpoint机制和生产配置

1.前提 在将Checkpoint之前&#xff0c;先回顾一下flink处理数据的流程&#xff1a; 2. 概述 Checkpoint机制&#xff0c;又叫容错机制&#xff0c;可以保证流式任务中&#xff0c;不会因为异常时等原因&#xff0c;造成任务异常退出。可以保证任务正常运行。 &#xff08;1&…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别&#xff1a; 默认输出级别为1&#xff0c;需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7&#xff0c;第二行把输出方式该为“serial”串口输出

后端面试真题--计算机基础篇

计算机基础 1、计算机网络&#xff08;常考&#xff09;2、操作系统3、数据结构4、Linux二级目录三级目录 1、计算机网络&#xff08;常考&#xff09; 1、介绍一下网络七层架构&#xff0c;TCP/IP的四层架构&#xff0c;每一层都有什么协议 2、讲讲TCP/IP的流量控制和拥塞控制…

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…

机器学习笔记 - scikit-learn中的metric参数和metric_params参数如何使用?

在 scikit-learn 库中的一些算法里面,这里是指需要使用距离度量或相似度度量的算法,这里拿KNeighborsclassifier举例来说,会有metric参数,这个参数用于指定距离度量方法。这个参数有多个可选项,常用的有以下几种: 1.euclidean:欧氏距离。这是默认的距离度量方法。 2.manha…

c++输入年月日,计算是该年的第几天

直接把每个月的天数存到数组直接相加会很方便&#xff0c;不用过多的判断。 注意&#xff1a;润年判断方法&#xff08;可以被4整除但不能被100整除&#xff0c;或者可以被400整除&#xff09; #include <iostream> using namespace std;int main() {int year,month,da…

PyCharm 中的特殊标记

在使用 PyCharm 开发 Python 项目的时候&#xff0c;经常会有一些特殊的标记&#xff0c;有些是 IDE 提示的代码规范&#xff0c;有些则为了方便查找而自定义的标记。 我在之前写过一些关于异常捕获的文章&#xff1a;Python3 PyCharm 捕获异常报 Too broad exception clause …

LeetCode——滑动窗口

滑动窗口 包含特定元素的子串&#xff08;要匹配到的目标&#xff09;&#xff0c;或最长[这个好像没啥意思]、或最短、或等长 思考&#xff1a;&#xff08;暂时感受&#xff09; 1&#xff09;什么时候扩充窗口——串没走完就得扩呀&#xff1b; 2&#xff09;窗口扩充后…

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

4D Solver

好的,我将详细解释一下4D Solver是如何将视频、深度数据与MetaHuman人物表情网格数据相结合的: 4D Solver实际上是一种先进的计算机视觉算法,它能将2D视频图像数据与3D几何网格数据相匹配和对齐。 具体过程分为以下几个步骤: 标定(Calibration) 首先需要对捕捉设备(iPhone或…