最近在看《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的类型比求和的类型范围大
后面还有优化的内容,就不写了。。。
每天进步一点点,我迟早会变成编程高手的!!!!!