快速业务通道

泛型编程:再现Min和Max

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
lhs : rhs; }
template <class L, class R>
MINTYPE(L, const R)
Min(L& lhs, const R& rhs)
{ return lhs < rhs ? lhs : rhs; }
template <class L, class R>
MINTYPE(const L, const R)
Min(const L& lhs, const R& rhs)
{ return lhs < rhs ? lhs : rhs; }

这四个重载的函数对应着在const和non-const之间四个可能的组合。这个主意不错,但是,我们该怎样来定义MINTYPE?我们知道有一个对应的技术traits,的确我们可以使用traits来完成MINTYPE比如:

#define MINTYPE(L, R) typename MinTraits<L, R>::Result
template <class L, class R> struct MinTraits;
// Specialization for the L == R case
template <class LR> struct MinTraits<LR, LR> {
typedef LR& Result;
};
// Specialization for bool and char
template <> struct MinTraits<bool, char> {
typedef char Result;
};
...

这样实现不错,但是你将不得不写很多糟糕的代码。由于有14数据类型,因此,你将不得不为了每一个组合编MinTraits。其实,你可以简化这个工作,就像macros一样,但是,这不是一个很完美的方案。

这个方案还没有完成,你必须考虑到用户定义的类。

另外,怎样为基类,子类调用Min()函数,看看下面的例子:

class Shape {
...
unsigned int Area() = 0;
};
bool operator<(const Shape& lhs, const Shape& rhs) {
return lhs.Area() < rhs.Area();
}
class Rectangle : public Shape { ... };
void Hatch(Shape& shape)
{
Rectangle frame;
...
Shape& smallest = Min(shape, frame);
... use smallest ...
}

事实上, 如果,min()处理Rectangle那么它将返回一个Shape的引用,这样就不好了。由于Rectangle会自动转化为Shape引用类型,这样,我们必须做很多事情。

同时,在上例中,我们也可以看出基于macro的min()函数也不会正常发挥作用,看下例子:

shape < frame ? shape : frame

它将两个参数转化为同样的类型,所以它等同于

shape < frame ? shape :(Shape) frame

显然,这不是我们所希望的(这种糟糕的行为叫slicing)

在这篇文章中实现的min(),能给予你像macro-based版本一样的min()功能,甚至更多。同时,它的实现大概只有80行(包括Max)

我们再温热一下我们的coffee,同时,开始讨论Loki。这些代码使用了Loki,Loki提高比较先进的符号操作,Min()用到的Loki工具有:

1 Typelists Typelists提供正规的Lists,它存储类型,不存储数值。

定义如下:

typedef TYPELIST_3(float, double, long double) FloatingPointTypes;

FloatingPointTypes 中包含三个类型

假设定义一个typelist 变量FloatingPointTypes,和任意类型 T,你可以通过使用编译时刻算法 Loki::TL::IndexOf察觉T是否在 FloatingPointTypes 。

例如:

Loki::TL::IndexOf<FloatingPointTypes, double>::value将返回1,如果 T不在这个list中返回-1。

2。Select Class Template 它的完全说明在参考 7中,简单的说,Select允许你选择一两个基于编译时刻的Boolean 常量。例如:

typedef Loki::Select<sizeof(wchar_t) <
sizeof(short int), wchar_t, short int>::Result
SmallInt;

SmallInt将是wchar_t,short int 中最小的整数类型。

3 TypeTraits 这是一个模板类它是用来推断类型的,例如判断是否这个类型是指针,这个指针指向什么变量等等。我们在这之使用了NonConstType TypeTraits<T>::NonConstType 是用来转化掉const。

4 Conversion 在参考7 中有它的详细说明。

这个类可以用来检测是不是一个一类型可以隐转化为另外的一个类型。Conversion是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号