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)));
- 编译器首先处理auto_ptr(new int(3)),这里面生成了一个临时变量。
- 编译器将临时变量丢给auto_ptr p()中继续构造,临时变量为const。但是auto_ptr中并没有auto_ptr(const auto_ptr& rsh)这个方法,于是编译器就试试看有没有其他办法。
- 这时候编译器开始尝试用其他方法解决问题,它注意到了有一个operator是 auto_ptr_ref()的东西,于是编译器尝试隐式转换是否能够成功,这次它成功了,并且产生了一个auto_ptr_ref
- 编译器将auto_ptr_ref甩给auto_ptr p()继续尝试构造,这时候编译器发现有一个方法auto_ptr(auto_ptr_ref<_Ty> _Right),而且这里面的参数不是引用,而是常值调用,编译器非常高兴的将auto_ptr_ref交给auto_ptr从而完成了构造
阅读全文
0 0
- c++小技巧(二)函数参数可以利用中间变量转换
- 循环体变量利用的小技巧
- VC小技巧二:变量初始化
- 利用中间缓存变量机制
- C/C++笔试系列--如何利用成员变量作为成员函数的默认参数
- c语言小技巧-类似默认参数
- 变量转换(不使用中间变量)
- 11.22C语言----指针变量/函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- 函数不能返回临时变量,可以采用输出参数形式
- tensorflow可以用来初始化变量的函数及其参数
- 不利用中间量交换两个变量
- 不通过中间变量就可以交换两个变量的值
- C语言及Easy X飞实现机大战
- 2017.11.12
- [自用门户]2个div透明度+z-index可以使2个div重叠,z-index越大代表显示在最上面层级越高
- Ubuntu下Tensorflow加载MNIST数据集(数据下载和读取)
- 传智C++课程笔记2
- c++小技巧(二)函数参数可以利用中间变量转换
- 开始我的BLOG
- JavaScript 尺寸及坐标
- OJ明明的随机数
- gdb中查看内存方法总结
- Match man
- X99安装MacOS 10.13无法启动的问题解决方案
- 201711122233->mysql库修改table
- Java数据结构之ArrayList(4)