第十六章 模板与泛型编程 (略过很多部分)

来源:互联网 发布:c语言入门至精通 编辑:程序博客网 时间:2024/06/05 21:15

16.1 模板定义

1) 例子:

template <typename T>

inline int compare(const T& v1,constT& v2)

{

         if(v1<v2)return -1;

         if(v1>v2)return -1;

         return0;

}

2) typename class是一样的

 

3) 在模板定义内部指定类型

template<class Param,class U>

Param fcn(Param * array,U value)

{

         Param::size_type*p;//这个时候编译器默认size_type是成员变量而不是类型

         typenameParam::size_type *p;//OK,这个时候是类型的意思

}

4) 非类型也可以作为模板形参

例子:

template<class T,size_t N>

void array_init(T (&parm)[N])

{

         for(size_ti=0 ; i!=N;++i)

                   parm[i]=0;

}

 

int x[10];

int y[100];

array_init(x);//自动引用实例array_init<int,42>

array_init(y);//同上

16.2 实例化

1) 类模板形参是必须的,类型匹配必须完全匹配

 

2) 使用函数模板的时候,编译器通常会为我们推断模板实参

 

3) 函数指针的实例化

template<class T>

int compare(const T&,const T&)

{

}

int (*pf1) (const int &,const int &)=compare;

16.3 模板编译类型

关于export一般不要用

16.6 模板特化

1) 函数

template<>

int compare <const char *>(const char* const &v1,const char *const v2)

{

return strcmp(v1,v2);

}

//这样在调用compare模板的时候,如果传入的参数是char*,那么就会用这个特例化的模板,而不是通用模板.

 

2) 可以对类特化,也可以只对类的成员特化

16.7 重载与函数模板

1) 首先考虑普通函数,其次考虑模板函数.首先考虑不需要隐式类型转换的函数,其次考虑需要隐式类型转换的函数