16.1 模板定义
1) 例子:
template <typename T>
inline int compare(const T& v1,const T& v2)
{
if(v1<v2) return -1;
if(v1>v2) return -1;
return 0;
}
2) typename 和class是一样的
3) 在模板定义内部指定类型
template<class Param,class U>
Param fcn(Param * array,U value)
{
Param::size_type *p;//这个时候编译器默认size_type是成员变量而不是类型
typename Param::size_type *p;//OK,这个时候是类型的意思
}
4) 非类型也可以作为模板形参
例子:
template<class T,size_t N>
void array_init(T (&parm)[N])
{
for(size_t i=0 ; i!=N;++i)
parm[i]=0;
}
int x[10];
int y[100];
array_init(x);//自动引用实例array_init<int,42>
array_init(y);//同上
1) 类模板形参是必须的,类型匹配必须完全匹配
2) 使用函数模板的时候,编译器通常会为我们推断模板实参
3) 函数指针的实例化
template<class T>
int compare(const T&,const T&)
{
}
int (*pf1) (const int &,const int &)=compare;
关于export一般不要用…
1) 函数
template<>
int compare <const char *>(const char * const &v1,const char *const v2)
{
return strcmp(v1,v2);
}
//这样在调用compare模板的时候,如果传入的参数是char *,那么就会用这个特例化的模板,而不是通用模板.
2) 可以对类特化,也可以只对类的成员特化
1) 首先考虑普通函数,其次考虑模板函数.首先考虑不需要隐式类型转换的函数,其次考虑需要隐式类型转换的函数