泛型编程-转移构造函数(Generic Programming: Move Constructor)
_(mojo::as_temporary(src.get().name_)) { Widget& rhs = src.get(); //... use rhs to perform a destructive copy ... } Widget(mojo::constant< Widget > src) // source is a const : name_(src.get().name_) // 译注:这里原文name_(src.name_)显然有误 { Widget& rhs = src; //... use rhs to perform a destructive copy ... } }; 在转移构造函数中的name_的初始化使用了一个重要的Mojo辅助函数:
as_temporary做的所有事情就是根据一个左值创建一个临时对象。使用这个方法,类成员的转移构造函数被目标对象所调用。 如果String是mojo化的,Widget得到他的优点;如果不是,一个直接的复制被执行。换句话说,如果String是mojo::enabled<String>的一个派生类,那么as_temporary返回一个mojo::temporary<String>。否则,as_temproary(String& src)是一个简单的函数,带一个String&的参数并返回同样的String&。 6 应用:auto_ptr的亲戚和mojo化的容器 考虑一个mojo_ptr类,它通过使拷贝构造函数私有而禁止它们:
这个类有一个有趣的行为。你不能复制这个类的常量对象。你也不能复制这个类的左值。但是你可以复制这个类的临时对象(使用转移语义),而且你可以显式的移动一个对象到另外的对象:
这本身并没有什么大不了的,如果 auto_ptr 里让 auto_ptr(auto_ptr&)私有,也可以做到这一点。有趣的地方不是mojo_ptr本身,而是如何使用as_temporary。你可以建立高效的容器,储存“经典”的类型、一般的mojo化的类型以及和mojo_ptr类似的类型。所有这样的一个容器当他需要转移元素时,必须使用as_temporary。对于“经典”类型,as_temporary是一个什么都不做的等效函数,对于mojo_ptr,as_temporary是一个提供平滑转移机制的函数书。move()以及uninitialized_move()的函数模板(参见所附代码,译注:代码请到原版链接处寻找)也唾手可得。 使用标准术语,mojo_ptr既不是可以复制的,也不是可以赋值的。然而,mojo_ptr可以看作是一种新类型,叫做“可转移的”。这是一个重要的新的分类,也许可以用于锁(lock)、文件(file)和其他的不可复制的句柄(handle)。 如果你曾经希望一个拥有元素的类似于 vector< auto_ptr<Widget> > 的容器,而且有安全、清楚的语义,现在你得到了,而且还有其他功能。另外,当包含一个拷贝昂贵 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |