C++模板 - traits

本文介绍了C++中的traits技术,通过一个累加模板函数的问题,展示了如何使用traits解决不同类型数据累加时返回值类型过小导致的错误。讨论了两种解决方案,包括增加模板参数指定返回类型和使用traits,强调了traits在泛型编程中的作用和优势,例如避免手动指定类型、早期发现错误等,并提到traits在STL迭代器中的应用。
摘要由CSDN通过智能技术生成

traits是个很好玩的东西,在泛型编程里面很常见。最早出于老外的一篇论文。http://www.cantrip.org/traits.html?seenIEPage=1 建议仔细阅读。

 

首先我们来看一段代码。

template<class T>
T accum(const T* ptr, int len)
{
	T total = T();

	for (int i = 0; i < len; i++)
	{
		total += *(ptr + i);
	}

	return total;
}


这是个模板函数,很简单,就是把传进来的参数累加,返回结果。

那么这段代码有什么问题呢?

我们写几行代码来测试一下:

	int sz[] = {1, 2, 3, 4, 5};
	int v1 = accum(&sz[0], 5) / 5;

	char str[] = {'a', 'b', 'c', 'd', 'e'};
	char v2 = accum(&str[0], 5) / 5;

前面两行代码把1,2,3,4,5累加然后去平均值。后面两行代码把abcde累计,然后取平均值。

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值