c++ 函数模板

来源:互联网 发布:淘宝刷单工作室赚钱吗 编辑:程序博客网 时间:2024/05/16 14:20

关键字template总是放在模板的电脑关于与声明的最前面,关键字后面是用逗号分隔的模板参数表,该列表是模板参数表,不能为空。模板参数可以是一个模板类型参数,它代表了一种类型;也可以是一个模板非类型参数,它代表了一个常量表达式。

模板类型参数由关键字class或typename后加一个标识符构成。在函数的模板参数表中,这两根关键字的意义相同,

模板非类型参数由一个普通的参数声明构成:

 template <class Type,int size> Type func(Type (&arr) [size]);

类型和值得替换过程被称为模板实例化。

当函数模板被调用时,对函数实参类型的检查决定了模板实参的类型和值,这个过程被成为模板实参推演。

c++ 支持两种模板编译模式:包含模式和分离模式

1.包含模式下,模板定义放在头文件中。

2.分离模式下,头文件值定义模板声明,在点C文件中export 模板

模板显示特化:

定义:关键字template和一对<> 然后是函数模板特化的定义。该定义指出了模板名,被用来特化模板的模板实参,以及函数参数表和函数体。

          例:typedef cost char * PCC;

                  template <> PCC max<PCC> (PCC s1,PCC s2){

                                  return (strcmp(s1,s2)>0?s1:s2);}

 注:一个程序不能对相同的模板实参集的同一模板同时有一个显示特化和一个实例。

函数模板可以被重载。

模板函数,模板显示特化函数,普通函数重载。根据模板实参推演最佳可行函数。

一个函数调用可以与普通函数以及函数模板的实例化函数都匹配。

普通函数和函数模板的函数重载解析步骤

1.生成候选函数集。

2.生成可行函数集

3.对类型转换划分等级

a.如果值选择了一个函数,则调用该函数。

b.如果给调用时二义的,则从可行函数集中去掉函数模板实例。

4.只考虑可行函数集中的普通函数,完成重载解析过程。

a.如果只选择了一个函数,则调用该函数。

b.否则,该调用是二义的。

模板定义中的名字解析分两个步骤:

不依赖于模板参数的名字在模板定义时被解析

依赖于吗模板参数的名字在模板被实例时被解析。

 

0 0
原创粉丝点击