首页 > 代码库 > 13--函数模板

13--函数模板

一.C++中的泛型编程

   --- 函数模板

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

        --- 类型可以被参数化

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

    说明: -template 关键字用于声明开始泛型编程

           -typename 关键字用于声明泛指的类型

   函数模板的应用

     -- 自动类型推导调用

     -- 具体类型显示调用

	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) 函数模板可以被重载













13--函数模板