快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
来调用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类:

namespace mojo
{
  template < class T >
  class constant
  {
    const T* data_;
  public:
    explicit constant(const T& obj) : data_(&obj)
    {
    }
    const T& get() const
    {
      return *data_;
    }
  };

  template < class T >
  class temporary : private constant< T >
  {
  public:
    explicit temporary(T& obj) : contant< T >( obj)
    {
    }
    T& get() const
    {
      return const_cast< T& >(constant< T >::get());
    }
  };
}

让我们再定义一个基类mojo::enabled,它包括了两个运算符:

template < class T > struct enabled //在mojo名字空间中
{
  operator temporary< T >()
  {
    return temporary< T >(static_cast< T& >(*this));
  }
  operator constant< T >() const
  {
    return constant< T >(static_cast< const T& >(*this));
  }
protected:
  enabled() {} //只能被派生
  ~enabled() {} //只能被派生
};

使用这个“脚手架”,将一个类“mojo化”的任务可以想象会变得更简单:

class String : public mojo::enabled< String >
{
   //...构造函数,析构函数,运算符,等等...
public:
   String(mojo::temporary< String > tmp)
   {
     String& rhs = tmp.get();
     //...执行rhs到*this的析构性复制...
   }
};

这就是传递函数参数的Mojo协议。

通常,一切工作良好,你得到了一个好的设计品。不错,那些意外的情况都控制在一个很小的范围内,这使他们更有价值。

用Mojo设计我们可以很容易检测到一个类是否支持Mojo。只需要简单的写:

namespace mojo
{
  template < class T >
  struct traits
  {
    enum
    {
      enabled = Loki::SuperSubclassStrict< enabled< T >, T >::value
    };
  };
};

Loki提供了探测一个类型是否从另一个类派生的机制。[5]

现在可以发现一个任意的类型X是按照Mojo协议设计的,只要通过mojo::traits<X>::enabled即可确定。这个检测机制对泛型编程是很重要的,很快我们就会看到它的作用。

4.2 函数返回值优化

现在我们可以正确的传递参数,让我们看看如何将Mojo扩展到函数返回值优化。这次的目的又是具有可移植性的效率改善,即100%的消除不需要的复制而不依赖于特定的返回值优化(RVO)实现。

让我们先看看通常的建议怎么说。出于好意,一些作者也推荐返回值的使用规则[7]:

[规则4]当函数返回用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多
运营中的策略
  • iBATIS 3内的新特性:将iBATIS用作应用程序内的一种持久框架 - 编程入门网
  • Photoshop绘制高光水晶质感水晶苹果
  • 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号