--- 函数模板
--- 提供一种特殊函数可用不同类型进行调用
--- 类型可以被参数化
template<typename T> void Swap(T& a,T& b) { T t=a; a = b; b = t; }
-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) 函数模板可以被重载
原文地址:http://blog.csdn.net/u014304293/article/details/39826407