首页 > 代码库 > 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--函数模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。