首页 > 编程语言 >[C++提高编程](一):模板----函数模板

[C++提高编程](一):模板----函数模板

时间:2024-03-22 18:59:51浏览次数:27  
标签:函数 int void C++ ---- charArr 模板 cout

目录

函数模板作用

函数模板的语法

注意事项

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

普通函数与函数模板的调用规则

模板的局限性

案例--通用数组选择排序从大到小


模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。

函数模板作用

建立一个通用函数,其函数返回值类型和形参类型可不具体制定,用一个虚拟类型来代表.

函数模板的语法

        template<typename T>

        函数声明或定义

注意事项

  • 自动类型推导,必须推导出一致的数据类型 T,才可以使用
  • 模板必须要确定出 T 的数据类型,才可以使用
#include <iostream>
using namespace std;

template<typename T>//typename可以替换成class
void swapType(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

template<typename T> //未确认T数据类型,无法使用自动类型推导调用
void func()
{
    cout << "func 调用" << endl;
}

static void test01()
{
	int a = 10, b = 20;
	cout << "交换前:a,b=" << a << "," << b << endl;
	swapType<int>(a, b);  //显示指定类型
	cout << "交换后:a,b=" << a << "," << b << endl;

	double x = 11.1, m = 22.2;
	cout << "交换前:x,m=" << x << "," << m << endl;
	swapType(x, m);       //自动类型推导
	cout << "交换后:x,m=" << x << "," << m << endl;

}

int main()
{
	test01();
	system("pause");
	return 0;
}

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

  • 普通函数可以发送隐式类型转换
  • 函数模板 用自动类型推导,不可以发生隐式类型转换
  • 函数模板 用显示指定类型,可以发生隐式类型转换

普通函数与函数模板的调用规则

  • 如果函数模板和普通函数都可以实现,优先调用普通函数
  • 可以通过模板参数列表来强制调用函数模板
  • 函数模板可以发生函数重载
  • 如果函数模板可以产生更好的匹配,那么优先调用函数模板

        注意:使用函数模板后就不要再使用普通函数,容易产生二义性

#include <iostream>
using namespace std;


void myPrint(int a, int b)
{
	cout << "调用普通函数" << endl;
}

template<class T> 
void myPrint(T a, T b)
{
	cout << "调用函数模板myPrint(T a, T b)" << endl;
}

template<class T>
void myPrint(T a, T b, T c) //函数重载
{
	cout << "调用函数模板myPrint(T a, T b, T c)" << endl;
}

void test()
{
	int a = 4, b = 1;
	myPrint(a, b);   //优先调用普通函数

	myPrint<>(a, b); //空模板列表强制调用函数模板

	myPrint(a, b, 3); //空模板列表强制调用函数模板

	myPrint('a', 'b'); //更好的匹配调用函数模板
}


int main()
{
	test();
	system("pause");
	return 0;
}

模板的局限性

        模板虽然通用但不是万能的

        利用重载,针对特定化类型提供具体化的模板

#include <iostream>
using namespace std;

class Person
{
public:
	string m_name;
	int m_age;

	Person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
};

template<class T> 
bool myCompare(T &a, T &b)
{
	if (a == b)
	{
		cout << "相等" << endl;
		return true;
	}
	else
	{
		cout << "不相等" << endl;
		return false;
	}
}

//利用重载,针对特定化类型提供具体化的模板
template<> bool myCompare(Person& p1, Person& p2) 
{
	if (p1.m_name == p2.m_name && p1.m_age == p2.m_age)
	{
		cout << "相等" << endl;
		return true;
	}
	else
	{
		cout << "不相等" << endl;
		return false;
	}
}

static void test()
{
	bool result = 0;

	int a = 4, b = 1;
	result = myCompare(a, b);  

	Person p1("Tom", 10);
	Person p2("Tom", 10);
	result = myCompare(p1, p2); 
}


int main()
{
	test();
	system("pause");
	return 0;
}

案例--通用类型数组-选择排序-从大到小

#include <iostream>
using namespace std;

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

template<class T>
void printArray(T arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i];
	}
	cout << endl;
}

template<class T> 
void mySort(T arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		int max = i; //认为最大值的下标
		for (int j = i+1; j < len; j++)
		{
			if (arr[max] < arr[j])
			{
				max = j;
			}
		}
		if (max != i)
		{
			mySwap(arr[max], arr[i]);
		}
	}
}

static void test01char()
{
	char charArr[] = "febadc";
	int num = sizeof(charArr) / sizeof(char);
	mySort(charArr, num);
	printArray(charArr, num);

}

static void test02int()
{
	int charArr[] = {3,1,9,4,5,7,8};
	int num = sizeof(charArr) / sizeof(int);
	mySort(charArr, num);
	printArray(charArr, num);

}

int main()
{
	test01char();
	test02int();
	system("pause");
	return 0;
}

标签:函数,int,void,C++,----,charArr,模板,cout
From: https://blog.csdn.net/weixin_43430048/article/details/136808015

相关文章

  • 蓝桥杯 python
    目录一、遍历列表1.使用for循环和enumerate()函数实现2.案例代码二、对列表进行统计和计算1.统计数值列表的元素和2.案例代码三、对列表进行排序1.使用列表对象的sort()方法2.使用内置的sorted()函数实现四、列表推导式1.从列表中选择符合条件的元素组成新的列表......
  • 【BFS】(代码详解)
    全面学习BFS的可以参照以下路径,本文章只附上部分代码的解释作为学习记录共勉(星星眼)原文链接:https://blog.csdn.net/m0_62881629/article/details/125072287给定一个n×mn×m的二维整数数组,用来表示一个迷宫,数组中只包含00或11,其中00表示可以走的路,11表示不可通过......
  • MIPI-协议层
    目录一.Pixel/BytePacking/UnpackingLayer二.lowlevelprotocol概述1.短包格式(D-PHY)2.长包格式(D-PHY)2.1长包-EmbeddedInformation3.DataIdentifier(DI)4.VirtualChannelIdentifier(VC)5.DataType(DT)三.LaneManagement简述:        pi......
  • 1.车载摄像头-物理结构
    目录概述整体框图1.镜头-Len2.CMOS数字图像传感器-Sensor3.图像信号处理-ISP4.串化器-Serializer5.连接器-Connector 5.1同轴电缆类(Coaxia) 5.2差分类(STP)参考连接概述下图的设备,我们称之为摄像头模组,它由镜头+图像传感器+ISP+串化器组成。国内......
  • GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?
    【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认......
  • Matlab在高光谱遥感中的作用:从数据处理到决策支持
    光谱和图像是人们观察世界的两种方式,高光谱遥感通过“图谱合一”的技术创新将两者结合起来,大大提高了人们对客观世界的认知能力,本来在宽波段遥感中不可探测的物质,在高光谱遥感中能被探测。以高光谱遥感为核心,构建大范围、快速、远程、定量探测技术,已在矿物填图、土壤质量参......
  • 十大经典排序之计数排序
    文章目录概要整体架构流程代码实现小结概要计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。整体架构流程(1)找出待排序的数组中最大和最小的元素(2)统计数组中每......
  • 数据爬取关键字——UA伪装
     1importrequests23#处理路径45#url='https://cn.bing.com/search?q=python%E7%88%AC%E5%8F%96%E7%BD%91%E9%A1%B5%E6%95%B0%E6%8D%AE'6#这里复制粘贴过来会变成乱码没关系吧乱码后面的修改一下就行了78#UA:伪装9#user_agent门户网站的服务......
  • Windows中控制台(cmd)模式下运行程序卡死/挂起现象解决方案(快速编辑模式)
    最近在运行编译好的exe文件时,发现了一个现象,就是通过cmd运行exe文件或者双击执行运行exe文件,偶尔会出现程序没有执行的情况。最开始发现这个现象时,还以为是程序出现了什么Bug。后面经过网上查询才知道,原始这一切都是控制台(cmd)模式下快速编辑模式捣的鬼。可能大家平常没有接触到,......
  • set_配置用法
    1前言  有些软件老是重复安装全是无用功,对于工作中用到的各类软件的安装配置归纳一下;  对于用法也归纳一下; *keilMDK*vscode  *.1安装步骤    *.1.1mingw下载安装:解压后给bin目录加个系统路径就行了;    *.1.2vscode下载安装:安装的时候勾选"将vscode添......