C++类模板与函数模板基础详细讲解_第1页
C++类模板与函数模板基础详细讲解_第2页
C++类模板与函数模板基础详细讲解_第3页
C++类模板与函数模板基础详细讲解_第4页
C++类模板与函数模板基础详细讲解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++类模板与函数模板基础详细讲解目录函数模板类模板总结

函数模板

当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传递给他的参数类型动态调用对应的函数版本,实现多种类型的比较。

templatetypenameT

intcompare(constTv1,constTv2)

if(v1v2)

return-1;

if(v2v1)

return1;

return0;

}

比较函数是一个模板函数,它支持T类型的对象比较,模板函数定义的规则是用template声明模板的类型为T,然后用T做参数即可。

调用的规则传递实参就可以了,前提是实参的类型要支持比较大小,如果是类的类型我们可以重载比较运算符。

intres=compare(3,4);

cout"compare(3,4)resis"resendl;

vectorintv1={1,3,5};

vectorintv2={2,4};

res=compare(v1,v2);

cout"compare(v1,v2)resis"resendl;

我们分别传递了int类型和vector类型的参数作为compare比较的参数。模板函数也支持多个类型,我们可以再定义一个支持多个参数类型的模板函数

templatetypenameT,typenameU

intprintData(constTt,constUu)

cout"tis"tendl;

cout"uis"uendl;

}

调用规则和上边类似,传递两个不同类型即可

printData(3.4,"helloworld");

模板函数也支持非参数类型,用已知类型定义变量

templateunsignedN,unsignedM

intcompareArray(constchar(p1)[N],constchar(p2)[M])

returnstrcmp(p1,p2);

compareArray的模板里用了已知类型unsigned定义了两个变量N和M。

调用的时候N和M会自动根据实参获取值

res=compareArray("hellozack","nicetomeetu");

cout"compareArray("

"hellozack"

",nicetomeetu"

")resis"resendl;

M和N就是传递的两个数组的长度。

类模板

我们实现一个模板类,使其支持类似vector的操作,包括push_back,empty,back,以及pop_back,取索引[]操作等。

//定义模板类型的blob

templatetypenameT

classBlob

public:

typedefTvalue_type;

typedeftypenamestd::vectorT::size_typesize_type;

//构造函数

Blob()

data=make_sharedstd::vectorT();

Blob(std::initializer_listTil)

data=make_sharedstd::vectorT(il);

//for(constTm:il)

//{

//data-push_back(m);

//}

//Blob中元素数目

size_typesize()const{returndata-size();}

boolempty()const{returndata-empty();}

//添加和删除元素

voidpush_back(constTt){data-push_back(t);}

//移动版本的push_back

voidpush_back(constTt){data-push_back(std::move(t));}

//删除元素

voidpop_back();

//元素访问

Tback();

Toperator[](size_typei);

private:

std::shared_ptrstd::vectorTdata;

//校验数据是否有效

voidcheck(size_typei,conststd::stringmsg)const;

};

我们在类外实现check,pop_back,back,以及[]操作。

templatetypenameT

voidBlobT::check(size_typei,conststd::stringmsg)const

if(i=data-size())

throwstd::out_of_range(msg);

templatetypenameT

voidBlobT::pop_back()

if(data-empty())

return;

data-pop_back();

templatetypenameT

TBlobT::back()

returndata-back();

templatetypenameT

TBlobT::operator[](size_typei)

check(i,"indexoutofrange");

return(*data)[i];

}

每一个类的成员函数在类外实现时都要声明template。

类模板的使用如下

voiduse_classtemp()

Blobint

Blobintia2={0,1,2,3,5};

Blobstringia3={"hello","zack","nice"};

for(size_ti=0;iia2.size();i++)

ia2[i]=i*i;

for(size_ti=0;iia2.size();i++)

coutia2[i]endl;

for(size_ti=0;iia3.size();i++)

string_upper(ia3[i]);

for(size_ti=0;iia3.size();i++)

coutia3[i]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论