泛型编程:再现Min和Max
关知识,那么,你可以查阅Herb的有关这方面的资料)在C++标准库中有一个更加有效的实现,它是基于模板的解决方案,如下:
你可以看出这个方案中参数和返回值都是const型,这也就导致一个问题。也许,你想把两个数值中小的那个的数值加2,那么,你也许会这么写:
基于宏定义min()就不会出现问题,但是,如果是模板基于模板上实现就不会那么听话了。因为你是不能改变const变量的值的,如同Scott所注意的一样。我们来更新我们的实现:
但是,这样还是不能令人满意。因为编译器不能处理混合类型-一个参数是const,一个是non-const。 例如:
不用说,基于宏的min()在这样的情况下又一次表现良好。基于模板的min(),必须这样写:
要想提供一个好的min/max,我们首先,要使得行为很像macros,同时,要避免macros带来的麻烦。 下面是一个聪明实现的开始:
为了把两个转换符统一为一个,在MinResult<LR,LR>要进行一些特殊局部处理。不然,L&,R&操作会被认为重复定义。这个方案推迟了计算,直到它需要的时候,同时,在结果取出之前,它表现了良好的惰性原则。例如:
实际上,上面的代码,没有做别的事情,同时,如果,你对类型有很多的思考的话,那么这样的代码将使得你对森林中的树的概念有着更多的思考。另一方面,如果,你这么使用:
那么,编译器将调用int&来转化min返回值(MinResult<int,int>)的临时变量。这个强制转化能够正确的工作,返回无误的结果。 尽管你能够解决完美的const相关问题了,但是MinResult还不是一个完美的方案。我们考虑一下下面的代码:
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()定义四个函数。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |