首页 > 其他分享 >模板——函数模板的基本语法和调用规则

模板——函数模板的基本语法和调用规则

时间:2024-07-15 23:30:41浏览次数:22  
标签:调用 return 函数 int void 语法 template 模板

1.模板函数

        1.1分为自动类型堆到和显示指定类型

template<class T>
void SwapNum(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}

void test01()
{
	int a = 10;
	int b = 20;
	double c = 30.5;
	double d = 40.8;
	SwapNum(a, b);//自动类型推导
	SwapNum<int>(a, b);//显式指定类型
	SwapNum(c, d);
	cout << a << " " << b << " " << c << " " << d << endl;
}

2.注意事项

2.1自动类型推导必须推导出一致的类型T才可以使用

2.2模板必须要确定T的数据类型才可以使用

template<class T>
void SwapNum(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}
template<class T>
void func()
{
	cout << "函数func的调用" << endl;
}
void test01()
{
	int a = 10;
	int b = 20;
	char c = 'c';
	SwapNum(a, b);//正确,可以推导出一致的类型数据
	//SwapNum(a, c);错误,推导不出一致的类型数据
}
void test02()
{
	//func();//不能直接调用函数模板
	func<int>();//要指定函数模板的参数才能调用
}

//函数模板案例——数组排序的函数模板

template<class T>
void SwapNum(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}
template<class T>//排序数组的函数模板
void Sort(T arr[],int len)//选择排序
{
	for (int i = 0; i < len; i++)
	{
		int min = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (i != min)
		{
			SwapNum(arr[i], arr[min]);
		}
	}
}
template<class T>//打印数组的函数模板
void Print_Arr(T arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
void test01()
{
	char arr1[] = "cabeidfgjh";
	int len = sizeof(arr1) / sizeof(char);
	Sort(arr1, len);
	Print_Arr(arr1, len);
}
void test02()
{
	int arr2[] = { 3,5,2,4,6,1,8,7,9 };
	int len = sizeof(arr2) / sizeof(int);
	Sort(arr2, len);
	Print_Arr(arr2, len);
}

3.普通函数与函数模板的区别

3.1普通函数调用时可以发生自动类型转换(隐式类型转换)

3.2函数模板在使用自动类型推导方式时,不会发生自动类型转换

3.3函数模板使用显示指定类型方式时,可以发生隐式类型转换

使用过程中建议使用显示指定类型方式,方便自己确定通用类型

int AddNum1(int a, int b)//普通函数
{
	return a + b;
}
template<class T>//函数模板
T AddNum2(T a, T b)
{
	return a + b;
}
void test01()
{
	int a = 10;
	int b = 20;
	char c = 'a';
	cout << AddNum1(a, c) << endl;//普通函数的隐式转换,a转为ASCII码值为97
	//cout << AddNum2(a, c) << endl;//自动推导型不能发生隐式转换
	cout << AddNum2<int>(a, c) << endl;//函数模板的指定类型方式可以
}

4.普通函数和函数模板的调用规则

4.1如果普通函数和模板函数都可以实现,优先使用普通函数(即使普通函数没有实现代码)

4.2可以通过空模板参数列表来强制调用函数模板

4.3函数模板也可以发生重载

4.4如果函数模板可以产生更好的匹配,优先调用函数模板

一般写了函数模板就不会再写普通函数,容易产生二义性

void Print(int a,int b)//普通函数
{
	cout << "调用的普通函数" << endl;
}
template<class T>//函数模板
void Print(T a,T b)
{
	cout << "调用的函数模板" << endl;
}

void test01()
{
	int a = 10;
	int b = 20;
	Print(a, b);//都可以实现,优先调用普通函数
	Print<>(a, b);//可以通过空模板参数列表来强制调用函数模板
	char c = 'c';
	char d = 'd';
	Print(c,d);//如果函数模板可以产生更好的匹配,优先调用函数模板
}

5.模板的局限性

template<class T>
void func(T& a, T& b)
{
	a = b;//如果传入的是数组,就无法实现赋值操作
}

template<class T>
bool Compare(T &a, T &b)//如果传入的是自定义类型就无法比较了
{
	if (a == b)
	{
		return true;
	}
	else
	{
		return false;
	}
}

5.1利用具体化的模板,可以解决自定义类型的通用化

5.2学习模板不是为了自己写模板,而是为了在STL中使用系统提供的模板

class Person
{
public:
	Person(string name,int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	string m_name;
	int m_age;
};
template<class T>
bool Compare(T &a, T &b)//比较不了自定义类型
{
	if (a == b)
	{
		return true;
	}
	else
	{
		return false;
	}
}
template<>bool Compare(Person& a, Person& b)//利用具体化的Person的版本实现代码,具体化优先调用
{
	if (a.m_name == b.m_name && a.m_age == b.m_age)
	{
		return true;
	}
	else
	{
		return false;
	}
}
void test01()
{
	int a = 10;
	int b = 10;
	if (Compare(a, b))
	{
		cout << "a==b" << endl;
	}
	else
	{
		cout << "a!=b" << endl;
	}
	Person p1("Tom", 10);
	Person p2("Tom", 10);
	if (Compare(p1, p2))
	{
		cout << "p1==p2" << endl;
	}
	else
	{
		cout << "p1!=p2" << endl;
	}

}

标签:调用,return,函数,int,void,语法,template,模板
From: https://blog.csdn.net/weixin_74207910/article/details/140436736

相关文章

  • linux高级编程(sqlite数据库调用)
    数据库1、分类:大型  中型        小型      ORACLE MYSQL/MSSQL SQLITE DBIIpowdb      关系型数据库    2、名词:      DB      数据库selectupdatedatabase      DBMS   数据库管理......
  • 易优CMS模板标签articlepay文章付费
      [基础用法]  标签:articlepay   描述:文章模型实现文章付费阅读,会员专享,会员付费,在使用之前先在文章模型开启付费阅读  属性:   aid=''文档id   id=''可以任意指定循环里的变量名替代c_field,假设id='c_field',模板调用如:{$c_field.hidden}变成 {$c_fiel......
  • 帝国CMS的点击显示验证码如何调用?
    帝国CMS的点击显示验证码如何调用?1、显示页面要加载/e/data/js/ajax.js文件,即加:<scriptsrc="/e/data/js/ajax.js"></script>2、显示验证码用:<divid="V变量名showkey"><ahref="#EmpireCMS"onclick="edoshowkey('V变量名showkey','......
  • JDK调用工具(一)
    1.HttpURLConnectionHttpURLConnection是Java提供的一个用于发送HTTP请求和接收HTTP响应的类。它位于java.net包中,用于建立与HTTP服务器的连接,并支持通过GET、POST等方法发送请求,并获取服务器的响应。使用示例如下:importjava.io.BufferedReader;importjava.......
  • 基于Go1.19的站点模板爬虫
    一、go语言简介Go(也被称为Golang)是一种开源的编程语言,由Google公司于2007年开始开发,并在2009年对外公开发布。Go语言的设计目标是提供一种简单、高效、安全的编程语言,适合并发编程和网络编程。以下是Go语言的一些特点和优势:简单易学:Go语言的语法简洁明了,只有25个关键字,......
  • 二分查找模板
    二分查找主要难点在于边界判定,逻辑相对简单,下文以力扣704.二分查找为例分析二分查找的代码模板。题目描述给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。来源:力扣(LeetCode)原......
  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • 数组001 基本语法
    #include<iostream>usingnamespacestd;//1、数组声明方式:////1.1只声明://数据类型数组名[数组长度]:intarr[10];//里面的元素未初始化,显示的结果不确定////1.2声明的时候初始化:////1.2.1数据类型数组名[数......
  • 网站源码软件公司pbootcms模板网页设计主题
    软件公司的网站设计分享我很高兴向大家介绍我刚刚制作的软件公司的网站设计。友好的站点界面,是打动访客的第一步。软件公司网站主题网站设计通常旨在展示公司的专业性、技术实力以及服务优势。以下是对软件公司网站主题设计的介绍,分为几个关键部分进行阐述:整体设计风格:简洁......
  • 网站源码机电设备pbootcms模板网页设计主题
    机电设备的网站设计分享我很高兴向大家介绍我刚刚制作的机电设备的网站设计。友好的站点界面,是打动访客的第一步。机电设备网站主题网站设计需要突出机电设备的专业性、技术实力以及公司形象。以下是对机电设备网站主题设计的详细介绍:1.整体设计风格专业与技术感:整体设计......