泛型编程-转移构造函数(Generic Programming: Move Constructor)
来调用Connect(TemporaryString) Conncet(String("http://moderncppdesign.com")); const String s4("http://moderncppdesign.com"); // 调用operator ConstantString() const // 接下来调用Connect(ConstantString) Connect(s4);如你所见,我们达到了期望的主要目标:在临时对象和所有其他对象之间制造了差别。这就是Mojo的要旨。 还有一些不太显眼的问题,大多数我们要一一解决。 首先是减少代码重复:Connect(String&)和Connect(ConstantString)基本上作相同的事情。上面的代码通过第一个重载函数调用第二个重载函数解决了这个问题。 让我们面对第二个问题,为每个需要mojo的类型写两个小类听上去不是很吸引人,所以让我们开始制作一些更具一般性的东西更便于使用。我们定义了一个mojo名字空间,并放入两个泛型的Constant和Temporary类:
让我们再定义一个基类mojo::enabled,它包括了两个运算符:
使用这个“脚手架”,将一个类“mojo化”的任务可以想象会变得更简单:
这就是传递函数参数的Mojo协议。 通常,一切工作良好,你得到了一个好的设计品。不错,那些意外的情况都控制在一个很小的范围内,这使他们更有价值。 用Mojo设计我们可以很容易检测到一个类是否支持Mojo。只需要简单的写:
Loki提供了探测一个类型是否从另一个类派生的机制。[5] 现在可以发现一个任意的类型X是按照Mojo协议设计的,只要通过mojo::traits<X>::enabled即可确定。这个检测机制对泛型编程是很重要的,很快我们就会看到它的作用。 4.2 函数返回值优化 现在我们可以正确的传递参数,让我们看看如何将Mojo扩展到函数返回值优化。这次的目的又是具有可移植性的效率改善,即100%的消除不需要的复制而不依赖于特定的返回值优化(RVO)实现。 让我们先看看通常的建议怎么说。出于好意,一些作者也推荐返回值的使用规则[7]: [规则4]当函数返回用 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |