模版与泛型编程--16章

模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。


一 基本定义 

模版包括模版类和模版函数。

定义格式为;template <typename/class T> class和template没有区别。

inline模版函数:template<class T> inline T min(const T&,const T&);

模版形参包括类型模版形参和非类型模版形参。

例如,类型模版形参T,非类型模版形参N

template <class T,size N> void arrayinit(T (&sparm)[N])

{

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

parm[i]=0;

}

int x[42];double y[10];

arrayinit(x);//instaniates arrayinit(int(&) [42])

arrayinit(y);instaniates arrayinit(double(&) [10])

二  实例化:产生模版的特定类型的实例的过程

1模版实参推断(从实参推断形参)

  • 多个类型形参的实参必须完全匹配。
  • 类型形参的实参的受限转换。

(1)const 转换。即const和非const在实例化时互相转换。

(2)数组或函数到指针的转换。(若形参是引用类型,则不行。因为数组以引用方式传递时,传递整个数组,数组大小是传递参数的一部分)

2 函数模版的显式实参

(1)指定实参

#include <iostream>
using namespace std;
template <class T> int sum(T m,T n){cout<<m+n<<endl;};
int main()
{
    sum(static_cast<long int>(3),4L);//不转换则为error
    getchar();

(2)在返回类型中使用类型形参

显式模版实参,从左到右匹配。

template <class T1,class T2,class T3>

T3 sum(T2,T1);

long val3=sum<long> (i,lng);//error因为尖括号内的long对应的是T1;所有没有给T3指定类型

long val2=sum<long,int,long>(i,lng);//ok

三   模版包含类型

1包含编译类型

调用函数时,编译器只需要看到函数的声明。一般而言,编译时类定义和函数声明放在头文件,而类成员函数和普通函数放在源文件。

模板则不同,编译器要求看到定义模版的源代码。所以在头文件中需要增加一条#include包含函数模板定义的源文件。即在头文件中加入#include":utility.cc"

2分别编译类型

据说在C++11已经被取消了



你可能感兴趣的:(模版与泛型编程--16章)