3、泛型编程

Part2泛型编程(Generic Programming)

  • 概观(overview)
  • 关联特性(Traits)
  • 迭代器(iterators)

一、概观
泛型:一种编程方法,与模板区别,泛型是一种思想,而模板是泛型的具体表现。
C++里面的泛型是通过模板及相关性质表现
二、特性(traits)(1)
是什么?
例子:数组 A[10] 计算所有元素的和

template <typename T> inline T Sigma(const* start,const* end)//输入为一个数组的首指针地址以及尾地址指针
{
	T total = T();//假设T的构造函数初始值为0
	while(start!=end){
		total += *start++;
	}
	return total;
}

特性(Traits)(2)

char szName[] = "abc";
std::size_t nLength = strlen(szNames);
char* p = szNames;
char* q = szNames + nLength;
printf("Sigma(szNames)=%d\n",Sigma(p,q));

这里得到的结果为38并不是预期的294
原因是char类型不能保存294,出现溢出(overflowed)
解决:强制转换 int s= Sigma(p,q);
更好解解决方法:引入Traits
T->associstion->characteristic of T -> another type ->trait !
生成一个与T型别有相关联的一个类。
Traits可以实现为模板类,而关联则是针对每个具体型别T的特化。在例子中我们将Traits命名为SigmaTraits,叫做traits模板(traits template)

如何实现?
*Y:*也就是传入char,通过trait使返回的类型为int。依次类推。。。
ReturnType 返回型别
template class SigmaTraits{};
template<> class Sigma Traiits{
public: typedef int ReturnType;
}//使返回的类型为int
在这里插入图片描述

template <typename T> 
inline typename SigmaTraits<T>::ReturnType Sigma(const* start,const* end)//
//输入为一个数组的首指针地址以及尾地址指针
{
	typedef typename SigmaTraits<T>::ReturnType ReturnType;//泛化返回类型
	ReturnType s=ReturnType();//将s初始化为ReturnType类型
	T total = T();//假设T的构造函数初始值为0
	while(start!=end){
		s+= *start++;
	}
	return s;
}

小结:虽然传入参数T的型别为char但是返回类型为int.
这样一个应用在STL里面应用特别多。

三、迭代器(1)
是什么?
迭代器是泛化的指针。
本身是一个对象,指向另一个对象,可以指向容器中任意一个容器。
在STL中的迭代器是容器与算法之间的接口
算法通常以迭代器作为输入参数
容器提供一种方式,可以让迭代器访问容器中的元素即可。
迭代器(2)
基本思想
分离和粘合。(算法和容器)
例子:find算法

template <class _lnlt,class _Ty>
inline lnlt find(_lnlt _First,_lnlt _Last,_Ty& _Val){
	for(;_First !=_Last;++_First)
		if(*_First == _Val)
			break;
	return (_First);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值