定义一个函数模板的格式如下:
template<typename T>
T add(T a,T b)
{
return a+b;
}
类模板函数只有在使用的时候才会生成实例,调用只有类型参数的函数模板时,编译器可以通过参数来推断参数类型,当其中有类型参数和非类型参数时,需要在调用时填入类型名。
定义一个类模板的时候应该为如下的格式:
template<typename T>
class A
{
public:
T func(T a);
};
template<typename T>
T A<T>::func(T a)
{
return a;
}
类模板中的成员函数只有在调用的时候才会生成实例,在类模板中使用类名时不需要加类模板参数,类外用一定要加。
模板成员函数不能是虚函数,不然程序报错。
模板成员函数的定义格式:
template<typename C>
class A
{
public:
template<typename T>
void func(T a,T b);
};
template<typename C>//先类的模板
template<typename T>//再函数模板
void A<C>::func(T a,T b)
{
return a>b?a:b;
}
显式实例化:
当多个文件都调用一个模板类或者模板函数时,模板类(函数)会在多个文件里实例化,大大降低了效率,为了能使模板只实例化一次,就需要显式实例化,比方说有以下模板:
template<typename C>
class A
{
public:
C _value;
};
template<typename T>
void prt(T a)
{
cout<<a<<endl;
}
现有cpp1,cpp2两个文件,在cpp1文件里进行显式实例化:
template A<float>;
template void prt<float>(float a);
在其他文件里声明此模板:
extern template A<float>;
extern template void prt<float>(float a);
此方法不推荐用,似乎用处不大。