13--函数模板

一.C++中的泛型编程

   --- 函数模板

        --- 提供一种特殊函数可用不同类型进行调用

        --- 类型能够被參数化

template<typename T>
void Swap(T& a,T& b)
{
	T t=a;
	a = b;
	b = t;
} 

    说明: -template keyword用于声明開始泛型编程

           -typename keyword用于声明泛指的类型

   函数模板的应用

     -- 自己主动类型推导调用

     -- 详细类型显示调用

	int a=1;
	int b=2;
	Swap(a,b);// 自己主动类型推导调用 
	
	float fa=3;
	float fb=4;
	Swap<float>(fa,fb);// 显示类型调用 

   对泛型编程的理解

       --- 编译器并非把函数模板处理成可以处理随意类型的函数

       --- 编译器从函数模板通过详细类型产生不同的函数

       --- 编译器会对函数模板进程两次编译

           --- 在声明的对方对函数模板代码本身进行编译 

           --- 在调用的地方对參数替换后的代码进行编译

二. 函数模板与重载

    函数模板能够像普通函数一样被重载

    *: C++编译器优先考虑普通函数

    *: 假设函数模板能够产生一个更好的匹配。那么选择模板

    *: 能够通过空模板參数类表的语法限定编译器仅仅通过模板编译

int Max(int a,int b)
{
	return a>b?

a:b; } template<typename T> T Max(T a,T b) { cout<<"template<typename T>"<<endl; return a>b?a:b; } template<typename T> T Max(T a,T b,T c) { return Max(Max(a,b),c); } int main() { int a=1; int b=2; cout<<Max(a,b)<<endl;// 优先选择普通函数 cout<<Max<>(a,b)<<endl;// 仅仅考虑模板的匹配 return 0; }


  说明:

	cout<<Max(a,b)<<endl;// 优先选择普通函数 
	cout<<Max<>(a,b)<<endl;// 仅仅考虑模板的匹配 

三. 多參数函数模板

    函数模板能够定义随意多个不同的类型模板

template<typename T1,typename T2,typename RT>
RT Add(T1 a,T2 b)
{
	return static_cast<RT>(a+b);
}

cout<<Add<char,float,double>('a',100)<<endl;

   将返回值类型參数声明到第一个參数位置。调用时仅仅需显示声明返回类型參数就可以。

template<typename RT,typename T1,typename T2>
RT Add(T1 a,T2 b)
{
	return static_cast<RT>(a+b);
}
cout<<Add<double>('a',100)<<endl;

小结:

    (1) 函数模板事实上是一个具有同样行为的函数家族

    (2) 函数模板能够依据类型实參对函数进行推导调用

    (3) 函数模板能够显示的指定类型參数

    (4) 函数模板能够被重载













原文地址:https://www.cnblogs.com/lxjshuju/p/7200619.html