没想到bind的功能这么强大,赶紧来看看,助你掌握新技能( 二 )
为了说明std::bind参数值是默认按照值传递的 , 首先实现函数Print, 该函数的入参是一个引用 , 函数内部将参数自增1 , 然后输出打印信息 。 接着再通过输出std::bind使用前后日志信息来确认是否是按照值传递 。
文章插图
从输入的打印信息看 , std::bind使用前后的信息没有发生变化 , 说明std::bind是默认按照值传递的 。
文章插图
如果想要按照引用来传递变量 , 应该如何操作呢 , 那么就是std::ref登场的时候 , std::ref是用于包装引用传递的值 。
文章插图
从输出打印信息看 , 采用std::ref传递变量之后 , std::bind使用前后的信息发生变化了 。
文章插图
另外补充一点 , std::cref用于包装const引用传递的值 。
文章插图
三、传统函数指针函数指针变量用于存储函数指针 , 以便后续的调用 。 有时候可以利用它实现多个消息对象的处理 , 并且一定程度满足开闭原则 。
首先实现抽象基类JAbstractBaseTest , 接着再实现继承JAbstractBaseTest的两个子类JObjA和JObjB
文章插图
完成上面的测试类 , 接着实现基础的框架 , 定义函数指针CreateObj , 该函数指针用于动态创建对象 , 然后再分别实现初始化创建对象的函数指针映射表以及通过id从映射表中获取函数对象的两个函数 。
文章插图
使用调用方式如下 , 通过id获取对象指针 , 然后执行对象的run函数 。 通过这样的方式 , 可以做到主体循环不变 , 如果需要添加新的对象处理 , 那么只要实现新的类 , 然后添加到映射表中即可 。
文章插图
四、std::bind代替函数指针std::bind和std::function的结合 , 可以实现函数指针的功能 。 通过using Funtor = std::function
文章插图
文章插图
调用JDebugBind的方式如下 , 只需要传递函数的id给函数RunTest , 即可执行到对应的函数 。 同样的 , 后续如果想要添加新的功能 , 那么只要实现新的函数 , 并且将其添加到map中即可 。
文章插图
五、std::bind实现函数回调函数回调在编程实现是一个特别重要的特性 , 它经常会在一些架构中使用到 。 而std::bind是可以实现函数回调的特性的 。 下图实现的类JDebugCallback中 , 构造函数接受一个类型为std::function的参数之后 , 将其赋值给类的成员函数m_callback , 后续调用函数Start的时候 , Start函数内部再调用m_callback , 从而实现函数回调 。 这里只是一个简单的例子说明 , 可能还不能充分看到函数回调的强大 。 希望这里作为一个引入 , 后续在实际工作中 , 再慢慢的体会 。
推荐阅读
- Windows 10全新任务栏功能更新上手体验
- 一加首款可穿戴设备OnePlus Band消息汇总:价格、参数、功能全揭秘
- 拜拜扫描仪!微信打开这个功能,文档表格扫一扫秒变电子档
- 微信又迎来更新!你们想要的功能终于来了
- 担心手机丢失,被盗刷?所有手机请马上开启这个功能
- 网易云音乐上线“一键迁移”虾米歌单功能:还免费送3个月黑胶VIP
- 空调行业要大变天:董明珠万万没想到,输给了雷军?
- CES 2021:JBL发布新款耳机 支持自适应噪声消除功能
- 便捷安装、功能强大的手机稳定器 大疆OM 4
- 九千元买的手机,最基本的功能都不好用,男子:还能干什么?