C++11新特性(67)- 标准库forward函数

本文讨论的问题比较复杂,这里由浅入深,一步一步说明。

传值函数模板

假设有一组函数,根据两个输入值进行工作,例如下面的add函数:

我们希望编写一个函数模板来调用这些函数。

这个函数模板的使用方法如下:

程序员可以根据需要,修改函数名参数和两个变量的类型。到目前为止算是准备活动。

 

左值引用参数函数模板

除了像add函数那样,两个参数都作为输入的函数以外,也许还希望调用这样的函数:

在这些函数中,希望将通过引用类型将运算结果输出。这种情况下可以按一下方式定义函数模板:

函数模板2的使用方法如下:

这个函数模板可以使用add和inc两种形式的函数。但是还有一个小问题:没有办法像第一种情况那样使用常数作为参数,因为常数是一个右值。

 

右值引用参数函数模板

 

为了解决左值引用参数模板的问题,可以定义右值引用参数函数模板。

有了这个模板之后,下面的代码都可以正常编译执行。

在输入参数的地方,指定常数也没有问题。已经很不错了。

 

前进中的问题

如果我们想这个模板函数调用下面的函数呢?

下面的代码是没有办法通过编译的。

编译错误为在调用swap_rvalue时int无法转换为int&&类型。

 

发生了什么

为了弄清楚函数模板内部的情况,作者编写了下面的函数:

这的函数的功能是为了是取得本文中提到的类型T的实际类型。虽然并不完整,但是可以用来说明本文中遇到的问题。这个函数可以这样使用:

输出结果如下:

它正确的输出了,int,int&和int&&的类型。我们可以吧showType嵌入到函数模板中:

为了回避编译错误,暂且屏蔽调用函数的部分。模板函数的输出结果为:

由于发生了上一篇文章中说明的引用合并,T1,T2的类型分别变成了右值。这就是调用swap_int失败的原因。

 

C++11的解决方式

 

为了解决模板函数中参数类型变化的问题,C++11中可以使用std::forward来恢复模板参数的左值或右值属性。修改后的代码如下:

在调用f之前,另外增加了两行代码以表示std::foward的执行结果。程序输出如下:

可以看到,调用时的类型被成功恢复,swap_int函数也被正确的执行了。不仅如此,下面的代码都能正确执行。

足够好用了吧。

 

作者见解

 

本文内容比较烧脑,请务必仔细理解。


 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值