泛型编程:再现Min和Max
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比如:
这样实现不错,但是你将不得不写很多糟糕的代码。由于有14数据类型,因此,你将不得不为了每一个组合编MinTraits。其实,你可以简化这个工作,就像macros一样,但是,这不是一个很完美的方案。 这个方案还没有完成,你必须考虑到用户定义的类。 另外,怎样为基类,子类调用Min()函数,看看下面的例子:
事实上, 如果,min()处理Rectangle那么它将返回一个Shape的引用,这样就不好了。由于Rectangle会自动转化为Shape引用类型,这样,我们必须做很多事情。 同时,在上例中,我们也可以看出基于macro的min()函数也不会正常发挥作用,看下例子:
它将两个参数转化为同样的类型,所以它等同于
显然,这不是我们所希望的(这种糟糕的行为叫slicing) 在这篇文章中实现的min(),能给予你像macro-based版本一样的min()功能,甚至更多。同时,它的实现大概只有80行(包括Max) 我们再温热一下我们的coffee,同时,开始讨论Loki。这些代码使用了Loki,Loki提高比较先进的符号操作,Min()用到的Loki工具有: 1 Typelists Typelists提供正规的Lists,它存储类型,不存储数值。 定义如下:
FloatingPointTypes 中包含三个类型 假设定义一个typelist 变量FloatingPointTypes,和任意类型 T,你可以通过使用编译时刻算法 Loki::TL::IndexOf察觉T是否在 FloatingPointTypes 。 例如:
2。Select Class Template 它的完全说明在参考 7中,简单的说,Select允许你选择一两个基于编译时刻的Boolean 常量。例如:
SmallInt将是wchar_t,short int 中最小的整数类型。 3 TypeTraits 这是一个模板类它是用来推断类型的,例如判断是否这个类型是指针,这个指针指向什么变量等等。我们在这之使用了NonConstType TypeTraits<T>::NonConstType 是用来转化掉const。 4 Conversion 在参考7 中有它的详细说明。 这个类可以用来检测是不是一个一类型可以隐转化为另外的一个类型。Conversion是 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |