泛型编程:再现Min和Max
整个实现的基础。
The MinMaxTraits Class Template 为了简化类型的计算,我建立了一个简单的线性types结构。首先我把所以types以固定的顺序放入。同时,我假定返回值的类型将是list中靠近底部的类型。定义如下:(不考虑const)
Min(long,double)那么返回结果应该是double类型,因为在list中double在long后面(译者:我们知道结果也应该是double) 现在,一般的算法就可以计算Min()的结果类型了。如果你的参数类型为不是引用的T,R具有如下条件: 1 假设 结果为R。 2 如果R可以隐转化为L,那么可以把结果转化为L型。 3 如果在Private::ArithTypes中R在L的后面,那么,转化结果为R型,这一步要处理很多的数学转化。 4 如果在不要引入临时变量的情况下,L&可以自动的转化为R&,那么结果转化为R&,这一步确保Min(frame,shape)将返回Shape&型。 5 如果在不要引入临时变量的情况下,R&可以自动的转化为L&,那么结果转化为L&, 这一步确保Min(shape,frame)返回Shape&. 在这中间罪艰难的一步是“不引入临时变量的类型间的转化”。本质如果not-const T的引用可以转化为not-const U的引用的话,那么,T可以在引入临时变量的情况下,转化为U。 The Min and Max Overloads 对应于const与not-const的参数的四个不同组合,这里有四个Min(),Max()函数重载了。为了避免在Shape/Rectangle例子中的Slicing问题,Min()有个不同于a<b?a:b的实现。如下:
分析: 让我看看这个新的实现是怎样满足Scott Meyers''''先生的要求的。他的要求如下: 1 函数在语意上要进行类型检查。明显Min()满足。 2 支持const ,non-const 参数。由于重载了四个函数。Min()支持non-const const的参数的任何组合。 3 支持不同参数类型。Min()很显然是支持不同的类型的,它做了大量的智能工作,这是macro和简单模板所无法完成的。Min()消除了不同类型之间的差别。主动的进行类型转化。这个转化过程是掌握在library编写人的手中。 4 不需要强制实例化,Min()不需要。 在不同的指针的情况下(Shape* ,Rectangle*)Min()也能表现的很好。 这是由于算法的第一步所实现的。 Min()的一个重要的特征是它可以一个算法来推断结果类型,而这个算法是你可以编写的。 如果你发现这个算法有什么不满意的地方。你可以自行修改。 很遗憾的是这个实现在一些编译器上无法通过,我知道代码是没有问题的。如果你有什么好的建议请联系我。 Look Ahead in Anger 这些天我在看 The Age of Spiritual Machines by Ray Kurzweil [8]. Kurzweil 说充分证明,在2020左右你将用不到$1000买到一个有人脑一样的机器。在那个时 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |