函數模板的一般形式:
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();
}