C++模板元编程——Traits

本文通过一个计算序列元素累加和的例子介绍了C++模板元编程中的Traits使用方法。针对不同类型可能出现的溢出问题,文章详细展示了如何通过特性类(traits)来选择合适的累积类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[转]C++模板元编程——Traits

通过一个计算序列元素的累加和的小函数来说明traits的使用。
计算一个序列的累加和:

template<typename T>
T accum(const T* beg, const T* end)
{
T total = T();
while(beg != end)
{
total += *beg;
++beg;
}
return total;
}
使用accum:
  int a[] = {3, 5, 7, 9};
const char* str = "abcd";
cout << "the a average: " <<  accum(a,a + 4) / 4 << endl; 
cout << "the str average: " << accum(str,str + 4) / 4 << endl;
输出结果:
the a average: 6
the str average: -29

问题来了,"abcd" 串的平均值居然是-29, 这明显是不对的。问题出在T  total,total 的类型为char,导致total += *beg 溢出。
解决的办法是通过类型T,得到一个比T能够表达更大范围的类型T1, 尽可能的保证不溢出。
1 特征类(traits)
定义AccumTraits特征类:
template<typename T>
struct AccumTraits
{
typedef T type; //默认情况下AccumTraits<T>::type 即为T
};
AccumTraits特征类char类型的特化:
template<>
struct AccumTraits<char>
{
typedef int type; //  //AccumTraits<char>::type 即为int
};
AccumTraits特征类int类型的特化:
template<>
struct AccumTraits<int>
{
typedef long type;
};
应该特化各种常用的容易溢出的类型如:char、short、int、float,以及相应的unsigned char、unsigned short ...
重新实现accum模板函数:

template<typename T> 
typename AccumTraits<T>::type 
accum(const T* beg, const T* end) 
{ 
typename AccumTraits<T>::type total  = AccumTraits<T>::type(); 
while(beg != end) 
{ 
total += *beg; 
++beg; 
} 
return total; 
} 
再次使用该函数: 
  int a[] = {3, 5, 7, 9}; 
const char* str = "abcd"; 
cout << "the a average: " <<  accum(a,a + 4) / 4 << endl; 
cout << "the str average: " << accum(str,str + 4) / 4 << endl; 
输出结果: 
the a average: 6 
the str average: 98
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值