没想到bind的功能这么强大,赶紧来看看,助你掌握新技能
std::bind是C++11中一个函数模版 , 就像函数适配器 , 接受一个可调用对象(callable object) , 生成一个新的可调用对象 。 通过它 , 我们可以实现类似传统的函数指针 , 函数回调等功能 , 并且能够降低代码的复杂度 。
【没想到bind的功能这么强大,赶紧来看看,助你掌握新技能】本文首先详细说明std::bind的基本用法以及解释使用过程中疑问点 , 然后再介绍如何利用传统函数指针搭建基础架构 , 再说明如何用std::bind来代替函数指针 , 最后介绍如何用std::bind来实现函数回调的功能 。
文章插图
一、std::bind的基本用法首先看下std::function, 它就是std::bind返回的新的可调用对象 。 如下图 , 定义实现了普通加法函数Add, 然后将该函数指针赋值给std::function类型的变量 , 这里可以注意到 , 使用了Add和&Add进行赋值 。 两者是等效的 , 这是因为使用Add的时候 , 会隐式转换成函数指针 。
文章插图
运行程序之后的输出信息 , 可以看出std::function类型的变量的使用与普通函数的使用是一样的 。
文章插图
我们不直接采用普通函数对std::function进行赋值 , 而是采用stb::bind , 首先看下简单的实例 , 其中std::placeholders::_1和std::placeholders::_2是占位符 , 代表函数的入参 。 如果调用的时候 , 需要传递具体实参 , 那么就需要使用placeholders来占位 。 这里需要注意std::placeholders::_1并不是代表函数的第一个入参数 , 至于为什么 , 请继续往下阅读 , 下面将会通过实例进行阐述 。
文章插图
如果函数的第二个入参是一个固定值 , 那么第一个入参就需要使用占位符std::placeholders::_1 , 如下所示 , 函数第二个参数固定位数值5 , 那么使用std::function类型变量的时候 , 也只需要传递一个参数 , 该参数代表Add函数的第一个参数 。
文章插图
如果Add函数的第一个入参是一个固定值 , 那么第二个入参就需要使用占位符std::placeholders::_1(注意不是std::placeholders::_2) , 如下所示 , 函数第一个参数固定位数值6 , 那么使用std::function类型变量的时候 , 也只需要传递一个参数 , 该参数代表Add函数的第二个参数 。
文章插图
当然 , 如果函数Add的两个参数都是固定值 , 那么使用std::function类型变量的时候 , 就不需要参数了 。
文章插图
这里有个小技巧 , 如果不想要书写std::function那么繁琐的信息表示 , 那么可以采用auto代替 , 但是注意不要滥用auto.
文章插图
二、std::bind的扩展上面说明的是stb::bind使用普通函数的方法 , 那么如果是类的成员函数呢?应该如何使用呢?首先s td::bind的第一个参数是类成员函数指针 , 第二个参数为类对象的指针 , 其他的用法与使用普通函数的用法是一样的 。
文章插图
- 远程|OPPO上线远程诊断功能,客服人工评估协助解决手机疑难问题
- 微信2021年首次更新,这项功能绝对值得一试!公众号文章可永久保存
- 微软详述Windows 10新任务栏功能体验
- 马云预测正确:扫码支付或被淘汰!只是没想到支付宝受到“威胁”
- 微信7.0.23即将更新!除了新增的提取文字,还有7个新功能
- 不止哈曼卡顿 小米11这些好用的音频功能你可能不知道
- 微信测试“朋友圈折叠”功能,网友吐槽:一片空白,让我开盲盒吗?
- iPhone升级iOS14这么久,这8个隐藏功能你不一定知道
- 虾米音乐将关停,赶紧来试试“一键迁移”虾米歌单功能吧
- 研究人员警示iPhone 12的MagSafe功能或对心脏起搏器造成干扰