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;
	else
		return 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.mfbz.cn/a/576432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android 去除桌面谷歌搜索框

注&#xff1a; 本文只是博主学习记录分享&#xff0c;仅供参考。如有错误请指出来&#xff0c;谢谢&#xff01; 一、问题描述 去除 android 系统桌面谷歌搜索栏&#xff0c;前后对比如下图&#xff1a; 系统版本&#xff1a;android12 平台&#xff1a;rk3568 二、…

【小浩算法cpp题解】判断环形链表

目录 前言我的思路思路一 &#xff08;哈希表记录链表的访问&#xff09;&#xff1a;思路二 &#xff08;双指针&#xff0c;快指针在前&#xff0c;慢指针在后&#xff09;&#xff1a; 我的代码运行结果 前言 前几天我写的代码&#xff0c;都是把所有的内容写在main函数里&…

Veeam配置备份oracle实例

Veeam是一家专门提供数据管理和数据保护解决方案的软件公司。他们的产品主要包括备份、复制和虚拟化管理等功能&#xff0c;旨在帮助企业保护其数据、应用程序和系统&#xff1b;NBU&#xff0c;COMMVALT&#xff0c;Veeam 国际三大知名备份软件厂商。本文介绍使用Veaam 备份Li…

【nodejs状态库mobx之computed规则】

The above example nicely demonstrates the benefits of a computed value, it acts as a caching point. Even though we change the amount, and this will trigger the total to recompute, it won’t trigger the autorun, as total will detect its output hasn’t been …

行人属性AI识别/人体结构化属性AI识别算法的原理及应用场景介绍

行人属性AI识别技术是一种基于人工智能技术的图像识别技术&#xff0c;通过对行人的图像或视频进行处理和分析&#xff0c;提取出其中的结构化信息&#xff0c;如人体姿态、关键点位置、行人属性&#xff08;性别、年龄、服装等&#xff09;等。 行人结构化数据分析的方法包括…

LORA详解

第一章、lora论文解析 参考论文&#xff1a; low rank adaption of llm 背景介绍&#xff1a; 自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应处理。在自然语言处理中的许多应用依赖于将一个大规模的预训练语言模型适配到多个下游应用…

小程序变更主体还要重新备案吗?

小程序迁移变更主体有什么作用&#xff1f;小程序迁移变更主体的作用可不止变更主体这一个哦&#xff01;还可以解决一些历史遗留问题&#xff0c;比如小程序申请时主体不准确&#xff0c;或者主体发生合并、分立或业务调整等情况。这样一来&#xff0c;账号在认证或年审时就不…

五一~感恩回馈,SolidKits工具折扣来袭!

SOLIDWORKS插件多样且丰富&#xff0c;有着不同的种类和用途&#xff0c;可以为SOLIDWORKS软件本身提升使用效率&#xff0c;更快速的响应你的操作方式。SolidKits自主设计研发多款SOLIDWORKS增效插件&#xff0c;包括&#xff1a;自动化参数设计插件、高级BOM插件、批量编码器…

【leetcode面试经典150题】75. 二叉树展开为链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Weblogic JMS

简介 全称:WebLogic Server的Java Messaging Service(JMS) WebLogic JMS 是与 WebLogic Server 平台紧密集成的企业级消息传递系统。 Java Message Service (JMS) API 是一种消息传递标准,允许基于 Java Platform Enterprise Edition (Java EE) 的应用程序组件创建、发送、…

基于STC12C5A60S2系列1T 8051单片机正常模式或移位模式控制数码管某位闪烁后单击长按增加或减少数值应用

基于STC12C5A60S2系列1T 8051单片机正常模式或移位模式控制数码管某位闪烁后单击长按增加或减少数值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A6…

MySQL Workbench 数据库常用操作

大家好哦&#xff0c;我是程序员徐师兄&#xff0c;今天为大家打来的是MySQL Workbench 数据库常用操作。 文章目录 一、连接数据库二、进入数据库三、创建数据库四、设置默认数据库五、创建数据表六、查看表数据七、查看数据表 一、连接数据库 二、进入数据库 三、创建数据库 …

【Leetcode】vector刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.只出现一次的数字2.杨辉三角3.删除有序数组中的重复项4.只出现一次的数字II5.只出现一次的数字III6.电话号码的字母组合 1.只出现一次的数字 题目链接&#xff1a;136.只出现一…

vivado 创建和运行链路清扫

创建和运行链路清扫 要分析给定链路的裕度 &#xff0c; 利用不同 MGT 设置来多次运行链路扫描是很有效的。这样有助于判定最佳设置。 Vivado Serial I/O Analyzer 功能支持您定义、运行、保存和重新调用链路清扫 &#xff0c; 链路清扫是由多次链路扫描集合而成的。 每条…

C++之STL-list+模拟实现

目录 一、list的介绍和基本使用的方法 1.1 list的介绍 1.2 list的基本使用方法 1.2.1 构造方法 1.2.2 迭代器 1.2.3 容量相关的接口 1.2.4 增删查改的相关接口 1.3 关于list迭代器失效的问题 二、模拟实现list 2.1 节点类 2.2 迭代器类 2.3 主类list类 2.3.1 成员变…

软件设计师-重点的创建型设计模式

一、简单工厂&#xff1a; 简单工厂模式属于创建型模式&#xff0c;但不属于23种设计模式之一。 软考中图 二、工厂方法&#xff1a; 意图&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 结…

光度立体法估计法线与反射率重建场景

1 从明暗恢复形状 从明暗恢复形状&#xff08;Shape from Shading&#xff0c;SfS&#xff09;是指从图像的明暗信息推断出物体表面几何形状的过程。这个问题假设光照条件已知&#xff0c;目标表面是光滑且均匀的&#xff0c;并且照明是单向的。其基本思想是根据目标表面对光照…

计算机组成原理实验(一)--可控加减法电路设计实验

一、一位全加器的设计 视频学习链接&#xff1a;3-2-4 定点数的加法和减法运算 — 一位全加器的硬件逻辑实现_哔哩哔哩_bilibili 仿真电路图&#xff1a; 总结&#xff1a;奇数个1时Si输出为1&#xff0c;偶数个1输出为0&#xff1b;1的个数大于等于2时&#xff0c;Ci输出1 实…

Kafka 3.x.x 入门到精通(05)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;05&#xff09;——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.5 存储消息2.6 消费消息2.6.1 消费消息的基本步骤2.6.2 消费消息的基本代码2.6.3 消费消息的基本原理2.6.3.1消费者组2.6.3.1.1 消费…

【优秀AI项目】每日跟踪 OpenVoice ,AI快站,OpenVoice

持续更新好玩的开源AI项目或AI商业应用体验 一起来玩转AI&#xff01;&#xff01; 1 huggingface 国内镜像站&#xff1a;AI 快站 HUggingface被墙了&#xff0c;emmmmm 所以我之前玩模型的一大感觉就是 下载什么模型之类的太难受了&#xff01;服了 看到一个镜像站——…
最新文章