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 operationclass 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.学会了调用用模板定义的函数

评论