快速业务通道

泛型编程-转移构造函数(Generic Programming: Move Constructor)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
_(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辅助函数:

namespace mojo
{
 template < class T >
 struct traits
 {
  enum { enabled =
   Loki::SuperSubclassStrict< enabled< T >, T >::value };
  typedef typename
    Loki::Select< enabled,temporary< T >,T& >::Result temporary;
 };
 template < class T >
 inline typename traits< T >::temporary as_temporary(T& src)
 {
  typedef typename traits< T >::temporary temp;
  return temp(src);
 }
}

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类,它通过使拷贝构造函数私有而禁止它们:

class mojo_ptr : public mojo::enable< mojo_ptr >
{
 mojo_ptr(const mojo_ptr&); // const sources are NOT accepted
public:
 // source is a temporary
 mojo_ptr(mojo::temporary< mojo_ptr > src)
 {
  mojo_ptr& rhs = src.get();
  //... use rhs to perform a destructive copy ...
 }
 // source is a function''s result
 mojo_ptr(mojo::fnresult< mojo_ptr > src)
 {
  mojo_ptr& rhs = src.get();
  //... use rhs to perform a destructive copy ...
 }
 //..
};

这个类有一个有趣的行为。你不能复制这个类的常量对象。你也不能复制这个类的左值。但是你可以复制这个类的临时对象(使用转移语义),而且你可以显式的移动一个对象到另外的对象:

mojo_ptr ptr1;
mojo_ptr ptr2 = mojo::as_temporary(ptr1);

这本身并没有什么大不了的,如果 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

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号