c++ 笔记 之 模版1

       最近在看《c++ template》,今天看到第15章(trait与policy类),收获很大啊

以前算几个数的和,如10个int类型的数就是声明一个int   totl存储累加的和,今天才意识到这个有可能

导致溢出。

 template <typename T>

inline T accum(T  const* beg,T const* end)

{

T total=T();

while(beg!=end)

{

total+=*beg;

beg++;

}

return total;

}

 

这个函数貌似没什么问题,可是如果测试的是char name[ ]="template";

int    length=sizeof(name)-1;

cout<<accum(&name[0],&name[length])/length;

本来这个求平均值根据ASCII码应该位于97和122之间,可是结果却不是这样

问题就是char的范围很小,这里越界了。。。。

解决方法就是定义一个类,然后特化这个类

template <typename T>

class  AccumulationTraits;

 

template  <>

class AccumulationTraits<char>

{

public:

      typedef int AccT;

};

 

那个求和函数也重写

 

template <typename T>

inline typename AccumulationTtaits<T>::AccT accum(T  const* beg,T const* end)

{

typedef   typename  AccumulationTtaits<T>::AccT  AccT;

AccT total=AccT();

while(beg!=end)

{

total+=*beg;

beg++;

}

return total;

}

这样就不会造成溢出了,因为定义total的类型比求和的类型范围大

后面还有优化的内容,就不写了。。。

每天进步一点点,我迟早会变成编程高手的!!!!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值