没想到bind的功能这么强大,赶紧来看看,助你掌握新技能( 二 )


为了说明std::bind参数值是默认按照值传递的 , 首先实现函数Print, 该函数的入参是一个引用 , 函数内部将参数自增1 , 然后输出打印信息 。 接着再通过输出std::bind使用前后日志信息来确认是否是按照值传递 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
从输入的打印信息看 , std::bind使用前后的信息没有发生变化 , 说明std::bind是默认按照值传递的 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
如果想要按照引用来传递变量 , 应该如何操作呢 , 那么就是std::ref登场的时候 , std::ref是用于包装引用传递的值 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
从输出打印信息看 , 采用std::ref传递变量之后 , std::bind使用前后的信息发生变化了 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
另外补充一点 , std::cref用于包装const引用传递的值 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
三、传统函数指针函数指针变量用于存储函数指针 , 以便后续的调用 。 有时候可以利用它实现多个消息对象的处理 , 并且一定程度满足开闭原则 。
首先实现抽象基类JAbstractBaseTest , 接着再实现继承JAbstractBaseTest的两个子类JObjA和JObjB
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
完成上面的测试类 , 接着实现基础的框架 , 定义函数指针CreateObj , 该函数指针用于动态创建对象 , 然后再分别实现初始化创建对象的函数指针映射表以及通过id从映射表中获取函数对象的两个函数 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
使用调用方式如下 , 通过id获取对象指针 , 然后执行对象的run函数 。 通过这样的方式 , 可以做到主体循环不变 , 如果需要添加新的对象处理 , 那么只要实现新的类 , 然后添加到映射表中即可 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
四、std::bind代替函数指针std::bind和std::function的结合 , 可以实现函数指针的功能 。 通过using Funtor = std::function来实现类似函数指针的声明 。 其中Funtor表示std::function的别名 。 然后在初始化表函数InitTab中 , 通过使用std::bind将类的函数成员一一映射到map中 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
调用JDebugBind的方式如下 , 只需要传递函数的id给函数RunTest , 即可执行到对应的函数 。 同样的 , 后续如果想要添加新的功能 , 那么只要实现新的函数 , 并且将其添加到map中即可 。
没想到bind的功能这么强大,赶紧来看看,助你掌握新技能文章插图
五、std::bind实现函数回调函数回调在编程实现是一个特别重要的特性 , 它经常会在一些架构中使用到 。 而std::bind是可以实现函数回调的特性的 。 下图实现的类JDebugCallback中 , 构造函数接受一个类型为std::function的参数之后 , 将其赋值给类的成员函数m_callback , 后续调用函数Start的时候 , Start函数内部再调用m_callback , 从而实现函数回调 。 这里只是一个简单的例子说明 , 可能还不能充分看到函数回调的强大 。 希望这里作为一个引入 , 后续在实际工作中 , 再慢慢的体会 。


推荐阅读