快速业务通道

泛型编程:再现Min和Max

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
关知识,那么,你可以查阅Herb的有关这方面的资料)在C++标准库中有一个更加有效的实现,它是基于模板的解决方案,如下:

const T& min(const T& lhs, const T& rhs)
{
return lhs < rhs ? lhs : rhs;
}

你可以看出这个方案中参数和返回值都是const型,这也就导致一个问题。也许,你想把两个数值中小的那个的数值加2,那么,你也许会这么写:

double a, b;
...
min(a, b) += 2;

基于宏定义min()就不会出现问题,但是,如果是模板基于模板上实现就不会那么听话了。因为你是不能改变const变量的值的,如同Scott所注意的一样。我们来更新我们的实现:

T& min(T& lhs, T& rhs)
{
return lhs < rhs ? lhs : rhs;
}

但是,这样还是不能令人满意。因为编译器不能处理混合类型-一个参数是const,一个是non-const。

例如:

int a;
short int b;
...
int smallest =min(a,b);// error: can''''t figure out T
// in template instantiation

不用说,基于宏的min()在这样的情况下又一次表现良好。基于模板的min(),必须这样写:

int smallest = min(a, int(b)); // aha, T is int

要想提供一个好的min/max,我们首先,要使得行为很像macros,同时,要避免macros带来的麻烦。

下面是一个聪明实现的开始:

emplate <class L, class R>
class MinResult {
L& lhs_;
R& rhs_;
public:
operator L&() { return lhs_ < rhs_ ? lhs_ : rhs_; }
operator R&() { return lhs_ < rhs_ ? lhs_ : rhs_; }
MinResult(L& lhs, R& rhs) : lhs_(lhs), rhs_(rhs) {}
};
template <class LR>
class MinResult<LR, LR> {
LR& lhs_;
LR& rhs_;
public:
operator LR() { return lhs_ < rhs_ ? lhs_ : rhs_; }
MinResult(LR& lhs, LR& rhs) : lhs_(lhs), rhs_(rhs) {}
};
template <class L, class R>
MinResult min(L lhs, R rhs)
{
return MinResult(lhs, rhs);
}

为了把两个转换符统一为一个,在MinResult<LR,LR>要进行一些特殊局部处理。不然,L&,R&操作会被认为重复定义。这个方案推迟了计算,直到它需要的时候,同时,在结果取出之前,它表现了良好的惰性原则。例如:

int a, b;
...
min(a, b);

实际上,上面的代码,没有做别的事情,同时,如果,你对类型有很多的思考的话,那么这样的代码将使得你对森林中的树的概念有着更多的思考。另一方面,如果,你这么使用:

int c = min (a,b);

那么,编译器将调用int&来转化min返回值(MinResult<int,int>)的临时变量。这个强制转化能够正确的工作,返回无误的结果。

尽管你能够解决完美的const相关问题了,但是MinResult还不是一个完美的方案。我们考虑一下下面的代码:

int a;
short int b;
extern Fun(int);
extern Fun(short int);
...
Fun(min(a, b)); // error! Don''''t know which overload to invoke!

MinResult<int,short int>支持两种转化:int&,short int&,结果是,编译器可以调用平等的调用任何一个fun()函数,在这一方面,基于宏的min()又顺利通过,它将调用像你想象的一样Fun(int)函数。

Quest for a Type

那么怎样才能天才般的解决这个问题。假设有两个类型L和R,考虑min(L,R)返回值的正确类型应该...。例如:L是char,R是int,毫无疑问,应该返回int。这样,我们可以清晰的为min()定义四个函数。

template <class L, class R>
MINTYPE(L, R)
Min(L& lhs, R& rhs)
{ return lhs < rhs ? lhs : rhs; }
template <class L, class R>
MINTYPE(const L, R)
Min(const L& lhs, R& rhs)
{ return lhs < rhs ?

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