模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性,模板可以分为两类,一个是函数模板,另外一个是类模板。
《函数模板》
形式:
template <class 或者也可以用typename T>
返回类型 函数名(形参表)
{
// 函数定义体。
}
template 是一个声明模板的关键字,类型参数一般用一个虚拟的标识来代表一个不特指的类型,在使用函数模板的时候,会将类型参数具体化。typename 和class关键字作用都是来表示它们之后的参数是一个类型的参数。class是在早期 C++中使用,后来为了不与类混淆,添加了typename关键字。
#include <iostream>
using namespacestd;
template <typename T>
T add(T _numA,T _numB)//加法函数模板。
{
return _numA+_numB;
}
int main(int argc,const char * argv[])
{
cout<<add(10,20)<<endl;//两个数必须是相同类型的。
cout<<add(2.4,4.4)<<endl;
cout<<add(4.5f,2.7f)<<endl;
return 0;
}
《函数模板重载》
和变通函数一样,在C++中模板函数也同样支持函数重载的功能,甚至可以将模板函数与普通函数混合在一起,以达到更为灵活的函数重载效果。
#include <iostream>
using namespace std;
template <typename T>
int code(T v)
{
return v.code()*2;
}
template <typename T>
int code(T * v)
{
return v->code();
}
int code(const int v)
{
return v+100;
}
class myClass
{
public:
int code()
{
return 200;
}
};
int main(int argc, const char * argv[])
{
myClass m;
cout<<code(m)<<endl;//调用的是对象的code
cout<<code(&m)<<endl;//调用的是指针。
cout<<code(10)<<endl;//调用是常量。
return 0;
}