快速业务通道

泛型编程:再现Min和Max

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
整个实现的基础。

The MinMaxTraits Class Template

为了简化类型的计算,我建立了一个简单的线性types结构。首先我把所以types以固定的顺序放入。同时,我假定返回值的类型将是list中靠近底部的类型。定义如下:(不考虑const)

namespace Private
{
typedef TYPELIST_14(
const bool,
const char,
const signed char,
const unsigned char,
const wchar_t,
const short int,
const unsigned short int,
const int,
const unsigned int,
const long int,
const unsigned long int,
const float,
const double,
const long double)
ArithTypes;
}
本身,unsigned types 应该在signed types后面, float 应该int 后面。例如

 

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的实现。如下:

template <class L, class R>
typename MinMaxTraits<L, R>::Result
Min(L& lhs, R& rhs)
{ if (lhs < rhs) return lhs; return rhs; }
template <class L, class R>
typename MinMaxTraits<const L, R>::Result
Min(const L& lhs, R& rhs)
{ if (lhs < rhs) return lhs; return rhs; }
... two more overloads ...
.. similar Max implementation ...
这两个返回语句确保正确的转化而且没有slicing现象。这四个重载函数可以处理如下的情况:Min(a +b, c + d) 、 Min(a +b, 5)。

 

分析:

让我看看这个新的实现是怎样满足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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号