- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C模板
泛型编程
让代码和其所处理的对象类型彼此独立。标准库中的容器,迭代器和算法都是泛型编程的例子。
而模板是泛型编程的基础。
模板(涉及到的所有代码,VS2010亲测)
1. 模板的概念。
重载:要为多种类型定义一个不同版本。代码冗余。没有事先定义的调用会出错。
能否只写一套代码解决这个问题呢?
C++引入模板机制。
模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化。 模版可以分为两类,一个是函数模版,另外一个是类模版。
模板工作原理:
模板定义并未引入新类型,新函数实体。
编译阶段编译器推断出具体类型后才生成新的类型或者新的函数。编译器承担了为我们使用的每种类型编写函数的单调工作。
链接阶段,识别合并等价模板实例。每一种类型只留一份实例。
只有当存在模板调用,才生成实例。不调用就不会实例化。
函数模板
2.1 函数模板写法
函数模板的一般形式如下:
template class\typename T
返回类型 函数名(形参表){//函数定义体 }
//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
//T可以被任何字母或者数字代替。
template class T
T min(T x,T y)
{ return(xy)?x:y;}
void main( )
{
int n1=2,n2=10;
double d1=1.5,d2=5.6;
cout 较小整数:min(n1,n2)endl; //min(n1,n2)指定模板实参,实参是值
cout 较小实数:min(d1,d2)endl;
system(PAUSE);
}
2.2 模板参数自动推导
2.2.1模板形参注意事项:
a 模板形参作用域:在声明为模板形参之后,知道模板声明或定义结尾处。
b 遵循名字屏蔽规则,屏蔽外部定义的同名。
c用做模板形参的名字不能再模板内部重用。
d模板声明和定义中模板形参名字不必相同
2.2.2什么情况可自动推导?
函数模板调用 fun模板参数类型表(函数参数)
一般可省略为fun(函数参数)
A 编译器只根据函数调用时给出的实参列表来推导模板参数值,与函数参数类型无关的模板参数无法推倒。
B 与函数返回值相关的模板参数也无法推倒。
C 所有可推导的模板参数必须是连续位于模板参数列表尾部,中间不能有不可推导的模板参数
#include iostream
templatetypename T0,
typename T1,
typename T2,
typename T3,
typename T4
T2 func(T1 v1, T3 v3, T4 v4);
int main() {
double sv2;
using namespace std;
sv2 = funcdouble, int, int(1, 2, 3);
cout \tsv2: sv2 endl;
sv2 = funcdouble, int, int(1, 3, 4);
cout \tsv2: sv2 endl;
sv2 = funcdouble, int, int(1, 0.1, 0.1);
cout \tsv2: sv2 endl;
sv2 = funcint, double, double(0.1, 0.1, 0.1);
cout \tsv2: sv2 endl;
}
templatetypename T0,
typename T1,
typename T2,
typename T3,
typename T4
T2 func(T1 v1, T3 v3, T4 v4)
{
T0 static sv0 = T0(0);
T2 static sv2 = T2(0);
std::cout \tv1: v1
\tv3: v3
\tv4: v4
\t|| sv0: sv0;
T2 v2 = sv2;
sv0 -= 1;
sv2 -= 1;
return v2;
}
所以上面的例子只可以把T3和T4省略。其他不能省略。也不支持sv2 = funcdouble, , int(1, 2, 3);
2.2 模板参数默认值
C++ 11标准允许为函数模板参数赋默认值
templatetypename T0 = f
文档评论(0)