| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> Item 34: Prefer lambdas to std::bind. -> 正文阅读 |
|
[开发工具]Item 34: Prefer lambdas to std::bind. |
Item 34: Prefer lambdas to std::bind.Effective Modern C++ Item 34 的学习和解读。 C++11 的 std::bind 是对 C++98 std:bind1st 和 std::bind2nd 的继承,它在 2005 年以 TR1 文档形式非正式地成为标准库的一部分。因为,许多 C++ 程序员可能有十几年的 std::bind 使用经验,现在告诉他放弃使用 std::bind,多少可能有些不情愿。但是,本 Item 会告诉你使用 lambda 替代 std::bind 将是个更好的选择。 对于 C++11,除了个别边缘 case,lambda 表达式要比 std::bind 更有优势。而对于 C++14,lambda 则可以完全替代 std::bind。 lambda 第一个优势是代码的可读性更强。例如,我们有一个设置声音报警的函数:
如果我们想在设置声音报警后 1h,关闭报警,并持续 30s。使用 lambda 表达式修正
上述代码逻辑非常清楚。如果使用 C++14 字面值
如果使用 std::bind 直接替换 lambda 表达式,可以改写成如下:
首先,相较于 lambda 版本,使用 std::bind,函数调用和传参不那么明显。并且这里还有一个占位符 “_1”,使用 最重要的是这里的代码逻辑有问题。显然,我们期望的是在调用
注意到
如果
先前 lambda 版本代码依然可以正常工作。但是,std::bind 将会产生编译报错。因为编译器无法确认传递哪个版本的
但是,这又引入了 std::bind 和 lambda 二者的不同。
但是 std::bind 不可以,
这就是使用 lambda 的第二个优势:代码的性能可能会更好。 使用 lambda 的第三个优势是代码更容易理解。看下面的例子:
假设我们想创建一个函数对象,用来指定特定
传递 std::bind 默认是拷贝它的参数到绑定对象内,用户可以使用
这就需要你了解 std::bind 实现机制。但对于 lambda 的实现版本,
同样明显的是参数如何传递给 lambda 的。这里,很明显
但是,std::bind 的绑定对象的调用,参数是如何传递的?
答案是引用传递,这就需要你了解 std::bind 的工作机制:std::bind 绑定对象的函数调用使用了完美转发机制。 通过上述比较我们可以看到,相较于使用 std::bind,使用 lambda 表达式的代码可读性更强、更容易理解、性能可能更好。对于 C++14,你没有理由不选择使用 lambda。对于 C++11,只有两种场景,std::bind 可以弥补 lambda 的不足: 第一:移动捕获。C++14 的初始化捕获模式支持移动捕获。C++11 的 lambda 不支持移动捕获,可以使用 std::bind 模拟来间接实现,参见 Item32 。 第二:多态函数对象。C++14 支持 auto 参数类型,也即通用 lambda,参见 Item33 。但是 C++11 不支持通用 lambda。而 std::bind 绑定对象的函数调用使用完美转发实现,可以接收任何类型的参数。如下例子:
C++11 做不到,C++14 则很容易:
最后总结下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/14 14:57:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |