第一个例子:比较两个数值的大小(整型、浮点型等)
注意调用的两种形式
template<class T> T TSWAP(const T &a,const T &b) { return a > b ? a : b; } int main() { cout << TSWAP(9, 20) << endl; /*cout << TSWAP<int>(9, 20) << endl;*//*也可行;*/ cout << TSWAP(9.5, 6.3) << endl; return 0; }
*注:对于函数模板,还有一个比较好的例子。假如实现一个函数,能够将大部分类型的数据输出,如果不用模板会很难实现,而用模板则很好的解决这个问题。
这个例子也说明了为什么必须用函数模板的一个原因。
template<class T> void PrintData(const T data) { cout<<data<<endl; }
二、隐式实例化
隐式实例化是指模板中的参数直到调用时才确定,并且由编译器根据传递过去的参数类型自动完成,比如上面的例子。
特点:一切都是未知。
三、显式实例化
显式实例化是指命令编译器直接创建满足条件的模板函数。
例子:
template int TSWAP<int>(const int ,const int );
特点:直接显式生成,但是没有函数体,而且只能显式声明一次。
四、特化
特化就是可以产生特殊操作,比如,如果参数是两个整型,函数就将两数相加,如果参数是两个double,就将两数相乘(当然,这个例子不太实际)。
特点:产生特殊操作,有函数体。
#include <iostream> #include <string> using namespace std; template<class T> T f(const T &a,const T &b) { return a+b; } template<> double f(const double &a,const double &b) { return a*b; } int main() { cout<<f(20,10)<<endl; cout<<f(20.5,10.0)<<endl; //调用特化函数 return 0; }
五、