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

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

被折叠的 条评论
为什么被折叠?



