C++学习总结(六)——函数模板

本文详细介绍了C++中的函数模板,包括不限定参数的函数模板、自动变量auto与函数模板的应用、函数模板与普通函数的选择、通用函数可变参数模板的设计及函数模板重载等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数模板的一般形式:

template<typename T>
T max(T *p,const int n)
{ }
一.不限定参数的函数模板

#include<stdlib.h>
#include<iostream>
#include<cstdarg>
//template<typename NT> NT sum(NT count,...) // 累加
template<typename NT> NT sum(int count,NT data1...) // 累加
{
	va_list arg_ptr;//参数列表指针
	va_start(arg_ptr,count);//限定从count开始,限定多少个元素
	NT sumres(0);
	for (int i = 0;i < count;i++)
	{
		sumres += va_arg(arg_ptr, NT);
	}
	va_end(arg_ptr);//结束
	return sumres;
}
//int getall(int n, ...)
//{
//
//}
//T 通用参数数据类型
template<typename T> T MAX(T *p,const int n)//函数模板,实现泛型,面向比较大小的一类对象
{
	T maxdata(p[0]);
	for (int i = 1;i < n;i++)	  //选择排序法
	{
		if (maxdata<p[i])
		{
			maxdata = p[i];
		}
	}
	return maxdata;
}
int getmax(int *p, int n)
{
	int max(0);
	max = p[0];
	for (int i = 1;i < n;i++)	  //选择排序法
	{
		if (max<p[i])
		{
			max = p[i];
		}
	}
	return max;
}
void main2()
{
	std::cout << sum(6, 1, 1, 1, 1, 1, 1)<< std::endl;
	std::cout << sum(5, 1.1, 1.0, 1.0, 1.0,1.0) << std::endl;

	system("pause");

}

void main1()
{
	int a[5] = { 1,4,7,3,8 };
	double b[5] = { 1.1,1.2,2.3,1.5,5.5 };

	std::cout <<MAX(a,5)<<' '<< MAX(b, 5)<<std::endl;



	system("pause");
}
注意:参数列表中至少要有一个是模板类型。
二.自动变量auto与函数模板

#include<stdlib.h>
#include<iostream>
#include<cstdarg>
/*
auto get(int num, double data)->decltype(num*data)
{

}
*/
//自动数据类型,根据实际推导出类型	 函数参数不允许使用自动变量
template<class T1,class T2>
auto get(T1 data, T2 bigdata)->decltype(data*bigdata)
{

	return data*bigdata;
}

void main()
{
	std::cout << typeid(get(12.0, 'A')).name() << std::endl;
	std::cout << get(12.0, 'A') << std::endl;

	system("pause");
}
注意:auto变量不能用于函数类型
三.函数模板与普通函数的选择 

函数模板根据类型覆盖,如果仍想要使用模板函数,要进行实例化,

#include<iostream>
template<class T>
T add(T a, T b)
{
	std::cout << "通用函数模板" << std::endl;
	return a + b;
}

int add(int a, int b)
{
	std::cout << "特有函数模板" << std::endl;
	return a + b;
}
void main()
{

	int a = 100, b = 200;
	float f1 = 10.9, f2 = 10.7;

	std::cout << add(a, b) << std::endl;//调用普通函数
	std::cout << add<int>(a, b) << std::endl;//调用函数模板,进行了实例化
	std::cout << add(f1, f2) << std::endl;

	std::cin.get();

}
四.通用函数可变参数模板。

用于处理不限定参数个数的参数,处理不同类型。

1.设计可修改副本

#include<iostream>
//通用可变参数模板  处理不限定参数的模板  处理不同类型
void showall()//空函数 作为接口,最后结束递归
{
}
template<typename T,typename...Args>
void showall(T value, Args...args)
{
	std::cout << value << std::endl;
	showall(args...);//继续传递
}
void main()
{
	int num1 = 10, num2 = 20, num3 = 30;
	double db1 = 10.9, db2 = 20.9, db3 = 30.9;
	char str[10] = "hahahaha";
	char ch = 'A';
	showall(num1, num2, num3);
	showall(db1, db2,db3);
	showall(str, ch);
	std::cin.get();
}
2.设计可修改原来的数据

void showall(T &value,Args &...args)
{ }
3.设计不可修改原来的数据不可以修改副本。

void showall(const T value,const Args...args)
{ }
4.设计引用原来的数据不可以修改。

void showall(const T &value,const Args &...args)
{ }
五.函数模板重载。

根据数组类型匹配模板

#include<iostream>
#include<array>
using std::array;
template<typename T>
void showarray(array<T, 10> myarry, int n)
{
	using namespace std;
	cout << "T"<<endl;
	for (int i = 0;i < n;i++)
	{
		cout <<' '<< myarry[i] ;
	}
	cout << endl;
	/*for (auto i : myarry)
	{
		cout << i;
	}*/
}
template<typename T>
void showarray(array<T*,10> myarry, int n)
{
	using namespace std;
	cout << "T*"<<endl;
	for (int i = 0;i < n;i++)
	{
		cout << ' ' << *myarry[i];
	}
	cout << endl;
	/*for (auto i : myarry)
	{
		cout << i;
	}*/
}
void main()
{
	array<int,10> intarry = { 1,2,3,4,5,6,7,8,9,10};
	array<int*, 10> pintarry;
	array<int**, 10> ppintarry;
	for (int i = 0;i <intarry.size();i++)
	{
		pintarry[i]=&intarry[i];
	}
	for (int i = 0;i <intarry.size();i++)
	{
		ppintarry[i] = &pintarry[i];
	}
	showarray(intarry,10);//根据类型选择函数模板
	showarray(pintarry, 10);
	showarray(ppintarry,10);
	std::cin.get();
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值