c++小技巧(二)函数参数可以利用中间变量转换

来源:互联网 发布:剑灵不知火舞捏脸数据 编辑:程序博客网 时间:2024/06/15 07:32

  很多时候由于一些限制,我们的函数声明参数只能为一种类型。然而我们的实参又必须要兼容另一种类型,这时候就可以利用一个中间类型,来进行一个隐式转换。典型的例子就是c++ auto_ptr的实现。

  auto_ptr所界定的是一种严格的拥有权观念,也就是说auto_ptr的copy构造函数和赋值函数都是拥有权的转移,我们需要在函数中修改auto_ptr本身。也就是说auto_ptr的copy构造函数参数不能声明为const.

//不能这样申请auto_ptr(const auto_ptr& rhs)//只能这样auto_ptr(auto_ptr& rhs)

但是这样一来,我们就不能写出右值作为参数的代码,因为只有const才能指向(引用)右值。比如下面这些语句,就会编译报错。

auto_ptr<int> p(auto_ptr<int>(new int(3)));

那怎么来解决这个问题呢?那就是用一个中间变量来转换下。我们引入auto_ptr_ref

template<class Y>    struct auto_ptr_ref    {      Y* yp;      auto_ptr_ref(Y* rhs)      : yp(rhs)      {}    };

同时向auto_ptr中加入如下代码

    template<class Y>    operator auto_ptr_ref<Y>() throw()    {          return auto_ptr_ref<Y>(release());    }    auto_ptr(auto_ptr_ref<T> rhs) throw()    :ap(rhs.yp)    {}

加入以上代码后,编译就能过了。还是以如下代码为例:

auto_ptr<int> p(auto_ptr<int>(new int(3)));
  1. 编译器首先处理auto_ptr(new int(3)),这里面生成了一个临时变量。
  2. 编译器将临时变量丢给auto_ptr p()中继续构造,临时变量为const。但是auto_ptr中并没有auto_ptr(const auto_ptr& rsh)这个方法,于是编译器就试试看有没有其他办法。
  3. 这时候编译器开始尝试用其他方法解决问题,它注意到了有一个operator是 auto_ptr_ref()的东西,于是编译器尝试隐式转换是否能够成功,这次它成功了,并且产生了一个auto_ptr_ref
  4. 编译器将auto_ptr_ref甩给auto_ptr p()继续尝试构造,这时候编译器发现有一个方法auto_ptr(auto_ptr_ref<_Ty> _Right),而且这里面的参数不是引用,而是常值调用,编译器非常高兴的将auto_ptr_ref交给auto_ptr从而完成了构造
原创粉丝点击