1、c++是强类型语言,不容易实现“为每个函数实例都显式定义一个函数”
2、宏定义和模扳提供了这种方法
3、宏定义的方法
#define min(a,b) ((a)<(b)?(a):(b))
这种方法对于简单的min()调用可以正常工作
但是,复杂调用时行为不可预期!!因为它的机制并不像函数调用那样工作,而只是简单地提供参数的替换
结果是,它的参数都被替换两次:一次在参数的测试中,另一次在宏的返回值被计算期间。
4、函数模版提供了一种用来自动生成各种类型函数实例的方法。
程序员对于函数接口中的全部或者部分类型进行参数化(parameterize),而函数保持不变。
5、例1:求两个数中较小者
template <class Type>
Type minm(Type a,Type b)
{
return a<b?a:b;
}
int main()
{
minm(10;20);
minm(10.0,20,0);
return 0;
}
6、例2 STL库中堆栈的用法 <stack>
///////6.1 简单的push(),pop()实现<deque> <stack>
#include <iostream>
#include <stack>
using namespace std;
typedef stack<int> ints;//函数模版的实例化
typedef deque<char> chars;
int main()
{
/* int a[10];
ints p;
for(int i=0;i<10;i++)
p.push(i);
for(i=0;i<10;i++)
{
cout<<p.top()<<endl;
p.pop();
}
*/
chars c;
char a[10]={'a','b','c','d','e','f','g','h','i','j'};
for(int i=0;i<10;i++)
c.push_back(a[i]);
for(i=0;i<10;i++)
{
cout<<c.front()<<endl;
c.pop_front();
}
system("PAUSE");
return 0;
}
/////6.2 汉诺塔的非递归实现
#include <iostream>
#include <stack>
using namespace std;
#define print_oprt(op) cout<<"move disk "<<(op).begin<<" from \'"<<(op).src<<"\'to\'"<<(op).dst<<"\'"<<endl;
class oprt;
typedef stack<oprt> oprt_stack;
//define the operation
class oprt
{
public:
oprt(){};
~oprt(){};
int begin,end;
char src,dst,bri;
prt(){};
oprt(int rbegin,int rend,char rsrc,char rdst,char rbri):
begin(rbegin),end(rend),src(rsrc),dst(rdst),bri(rbri){}
};
int hanoi_s(int size,char src,char dst,char bri)
{
oprt_stack ostack;
oprt tmp;
ostack.push(oprt(1,size,src,dst,bri));
while (!ostack.empty())
{
tmp = ostack.top();
ostack.pop();
if (tmp.begin != tmp.end)
{
ostack.push(oprt(tmp.begin,tmp.end-1,tmp.bri,tmp.dst,tmp.src));
ostack.push(oprt(tmp.end,tmp.end,tmp.src,tmp.dst,tmp.bri));
ostack.push(oprt(tmp.begin,tmp.end-1,tmp.src,tmp.bri,tmp.dst));
}
else
print_oprt(tmp);
}
return 0;
}
void main()
{
hanoi_s(3,'x','y','z');
}
6、结论,1.如果一个函数的实现在一组实例上保持不变,并且每个实例都处理一种唯一的数据类型,则该函数就是模版的最佳候选者
2.学会了调用用模板定义的函数
正文
总结:函数模版(template)的使用2006-06-11 23:18:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/bclz/15741.html
阅读(9268) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论