-Introduction : 你可以为你的函数写一个模板,也可以为你的类写一个模板。
为什么要为函数写一个模板?
- 某个函数,针对不同数据。操作方法都是一样的,只是参数类型不同
- 当然利用函数重载是没问题的,但是一个一个定义很麻烦,所以我们需要函数模板
template< class 形参名, class 形参名, ……> 返回类型 函数名(参数列表){ 函数体 }
//这里的class跟类没任何关系,如果你觉得这个class让你觉得很烦,请使用下面的定义方法
template< typename 形参名, typename 形参名, ……> 返回类型 函数名(参数列表){ 函数体 }
(1).实际使用中,template放在main函数外,放在头文件位置
(2).使用的时候,直接调用函数,把数据直接放到函数里面,程序会自动判断这是何种类型的数据
然后typename就变成了这种数据类型
- 括号< >内部的内容叫做 “模板形参” ,就是这个模板函数要用的形参,很像函数形参
- 模板形参不能为空
- 模板函数声明过后,我们在模板函数体内,不仅可以使用这个 “模板形参 T” ,也可以使用其他类型
- 例如: template < typename T, int c > T function_test( T& t , int c) { … }
2.为什么要写一个函数模板? 因为数据,方法的格式都是一样的,只是数据类型会不一样
template< typename 形参名, typename 形参名, ……> class 类名 {…};
举例:template< typename T> class A { public: T a; T b; T add(T c, T &d);};
模板类实现方法: A< int > a 括号< >内填上本次实现过程中typename所对应的数据类型
- 然后所有的T 全部被替换成本次所用的数据类型
类模板外定义函数体的方法:
template < 模板形参参数列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
template< typename T1, typename T2> void A< T1, T2>::add(){ ... }
注意事项
(1).虽然template也可以使用自己的数据类型,但只能是int,其他的诸如double string string*不允许。但是double* double& 可以,对象引用或者对象指针可以
参考:
http://blog.csdn.net/yzhang6_10/article/details/50839516