当前位置: 首页 > article >正文

C++模板:函数模板

基本语法:

template <typename T>
void mySwap(T& a, T& b)
{//类型参数化
	T temp = a;
	a = b;
	b = temp;
}
void test01()
{
	int a = 10, b = 20;
	//自动类型推导
	mySwap(a,b);
	//显示指定类型
	mySwap<int>(a, b);
}

实例:数组排序

template<class T>
void mySort(T arr[], int len)
{
	cout << len << endl;
	for (int i = 0; i < len-1; 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]);
		}
	}
}
template <typename T>
void PrintArr(T arr[], int len)
{
	for (int i = 0; i < len; i++)cout << arr[i] << " ";
	cout << endl;
}
void test02()
{
	char charArr[] = "badcef";
	int num = sizeof(charArr)/ sizeof(char);
	num -= 1;//消除'\0'的影响
	mySort(charArr, num);
	PrintArr(charArr, num);
	int intArr[] = { 0,2,1,3,4,5 };
	num = sizeof(intArr) / sizeof(int);
	mySort(intArr, num);
	PrintArr(intArr, num);
}

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

普通函数可以发生隐式类型转换,而对于函数模板,自动类型转换不可以发生隐式类型转换
,显示指定类型可以发生隐式类型转换。

template<typename T>
T myAdd(T a, T b)
{
	return a + b;
}
void test03()
{
	int a = 10;
	char c = 'c';
	cout << myAdd<int>(a, c) << endl;
}

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

//如果函数模板和普通函数都可以调用,优先调用普通函数

//通过空模板的参数列表,强制调用函数模板

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

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

template<typename T>
void myPrint(T a, T b,T c)
{
	cout << "调用重载的函数模板" << endl;
}
void test04()
{
	int a = 10, b = 20;
	//如果函数模板和普通函数都可以调用,优先调用普通函数
	myPrint(a, b);
	//通过空模板的参数列表,强制调用函数模板
	myPrint<>(a, b);
	myPrint<>(a, b, 1);
	//如果函数模板产生更好的匹配,优先调用函数模板
	char c1 = 'c', c2 = 'a';
	myPrint(c1, c2);
}

模板的局限性:

class Person
{
public:
	Person(string name,int age)
	{
		m_Name = name;
		m_age = age;
	}
	string m_Name;
	int m_age;
};
template<class T>
bool myComp(T& a, T& b)
{
	if (a == b)return true;
	else return false;
}
template<> bool myComp(Person& a, Person& b)
{
	if (a.m_age == b.m_age && a.m_Name == b.m_Name)return true;
	else return false;
}
void test05()
{
	Person p1("Tom", 10); Person p2("Tom", 10);
	bool ret = myComp(p1, p2);
	if (ret)
	{
		cout << "p1==p2" << endl;
	}
	else cout << "P1!=p2" << endl;
}


http://www.kler.cn/a/227863.html

相关文章:

  • 如何获取当前的位置信息
  • http和https的区别?
  • 【Block总结】PConv,部分卷积|即插即用
  • 模型I/O
  • LINUX部署微服务项目步骤
  • 【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用
  • 幻兽帕鲁服务器自动重启备份-python
  • Python这些模块,你了解吗?
  • 2024年最新幻兽帕鲁服务器搭建教程
  • H5 加密(MD5 Base64 sha1)
  • vue3 之 组合式API—watch函数
  • 设计模式之工厂模式(工厂方法模式、抽象工厂模式)
  • 20240202金融读报1分钟小得
  • 基于Python查看TNT Go有线版串口数据以及屏幕电量
  • AI应用开发-git开源项目的一些问题及镜像解决办法
  • 开源协议介绍
  • Flink实战四_TableAPISQL
  • parameter ‘MAX_BYTE‘ used as named parameter override, is a localparam
  • R语言基础学习-02 (此语言用途小众 用于数学 生物领域 基因分析)
  • 数据库管理-第143期 Oracle DB 19c需要调整的基本参数V2(20240202)
  • SpringBoot 登录检验JWT令牌 生成与校验
  • nodejs+vue+ElementU教师科研管理系统l33wm
  • OpenCV学习记录——特征匹配
  • Cocos XR的WebBox实现流程
  • 【Java万花筒】编织数字音符:Java多媒体魔法
  • windows pm2 执行 npm脚本或执行yarn脚本遇到的问题及解决方案