函数模板示例
template <class T>
T max(T a,T b)
{
return(a<b)?a:b;
}
char a,b;
char c=max<char>(a,b);
templete<typename T,typename S>
void max(T a,S b)
{
//内容
}
template<typename T,int X>
void f(T a)
{
cout<<X<<endl;
}
f<char,5>('v');
类模板示例
template <typename T>
class A
{
public:
void f();
...
private:
T *ptr;
}
template <typename T>
void A<T>::f()
{
...
}
//实例化时
A<int> a;
//示例二:
template <typename T,int Tsize>
class B
{
public:
void f();
private:
T t;
}
template <typename T,int Tsize>
void B<T,Tsize>::f()
{
for(int i=0;i<Tsize;i++)
{
cout<<t<<endl;
}
}
//实例化时
B<char,5> b;
b.f();
很多编译器不支持将类模板与模板函数分离成.h与.cpp编译
类外定义成员函数时,每一个函数前都要加template声明
函数模板的显式实参
常用在实现不同数据类型做处理或运算的时候,返回值可能是不同于实参类型的。
如:实现int与long 的加法操作
合理的处理方法是:
将较小的数据类型强制转换后再做运算,运算结果用较大数据类型保存。
指定返回类型的一种方式是引入第三个模板形参,它必须由调用者显示指定。
template <typename T1,typename T2,typename T3>
T1 sum(T2,T3)
{...}
调用时需要显式指定:
long val3=sum<long>(i,lng);
应当注意的是:显式模板形参从左至右与模板形参相匹配,即函数定义处的形参顺序是与模板声明从左至右依次匹配的。正由于依次匹配,因此调用时最右边两个形参的显式模板实参才可以省略。
如果函数定义时顺序不匹配,则需要在函数调用时为所有的形参指定实参。
例如:
long val3=sum<long,int,long>(i,lng);
编译模板模型
当编译器看到模板定义的时候,它不立即产生代码,只有在看到模板时,如调用了函数模板或定义了类模板的对象的时候,编译器才产生特定类型的模板实例。
最常用的是 包含模型
需要在头文件中声明模板,格式如下:
template <typename T> int compare(const T&,const T&);
#include "a.cpp"
a.cpp中应当包含模板函数的定义
template <typename T> int compare(const T &v1,const T &v2)
{
if(v1<v2) return -1;
if(v2<v1) return 1;
return 0;
}
此外还有只有部分编译器支持的***分别编译模型***,这里不加解释