C++學習總結(六)——函數模板

函數模板的一般形式:

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();
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章