bind函数模版
一、std::bind包装器/适配器介绍
1、函数模版bind生成f的可调用函数对象包装器,调用此包装器等价于一些绑定到args的参数调用f。
2、可以用来将用户提供的需要一个参数的函数转换成不需要参数的函数对象。绑定的值存储在函数对象内并且会被自动传递给指定的函数
二、std::bind定义
template< class R, class F, class... Args >
bind( F&& f, Args&&... args );
参数说明:
f:可调用对象(函数对象、指向函数指针、函数引用、指向成员函数指针或执行数据成员指针)
args:要绑定的参数列表,未绑定参数为命名空间std::placeholders的占位符_1、_2、_3....所替换
三、bind原理
1、可以用来将用户提供的需要一个参数的函数转换成不需要参数的函数对象。绑定的值存储在函数对象内并且会被自动传递给指定的函数
bind自身是函数模版,第一个参数是可调用对象;第二个参数是参数列表
(方便理解,描述可能错误)bind内部通过函数指针存储可调用对象;通过值存储参数列表;最终在函数对象(operator())中完成函数调用
图1 bind绑定普通函数2、参数绑定也可以用于将类成员函数转换成零参数的函数对象。非静态成员函数需要一个隐士的this参数(相当于一个雷对象指针),这意味需要一个合适的类实例指针到这个函数对象
图2 bind绑定成员函数3、隐士的this指针也可以显示地传递给需要一个参数的函数对象(自己测试没通过)
图3 bind绑定成员函数4、函数对象经常同事使用提前绑定的参数和调用时才提供参数,这个可以用成员函数来实现
图4 bind绑定时参数使用占位符5、使用非成员函数
图5 bind绑定非成员函数6、有时函数对象被调用时会提供多于的参数,而这些参数是目标函数不需要的,bind会自动忽略这些多于的参数
图7 bind使用占位符规则7、多于的参数不需要一定在函数对象签名的最后面(std::placeholders的占位符 决定)
图7 bind使用占位符规则8、bind还允许重新组织函数对象的参数顺序
图8 bind使用占位符规则四、使用详解
1、可调用元素
图1 普通函数 图2 类成员函数 图3 类模版2、将std::bind绑定到可调用元素
1)绑定到普通函数
图4 bind普通函数2)绑定到函数模版
图5 bind到函数模版3)绑定到lambda表达式
图6 bind到lambda表达式4)绑定到函数对象
图7 bind到函数对象5)绑定到类模版函数对象
图8 bind到类模版函数对象6)绑定到静态成员函数
图9 bind到静态成员函数7)绑定到静态成员模版函数
图10 bind到静态成员模版函数8)绑定到成员函数(this指针,不预绑定)
图11 bind到成员函数(预绑定)9)绑定到成员模版函数(this指针,不预绑定)
图12 bind到成员函数(不预绑定)10)绑定到成员模版函数(this指针,预绑定)
图13 bind到成员模版函数(不预绑定)11)绑定到成员模版函数(this指针,不预绑定)
图14 bind到成员函数(不预绑定)五、注意事项
1、预绑定的参数是值传递的
2、不预绑定的参数要用std::placeholders占位符的形式占位,从_1开始,一次递增,是以引用的形式
3、std::bind的返回值是可调用实体,可以直接赋值给std::function
4、对于绑定的指针,引用类型参数,调用者需要保证在调用之前生命周期还存在
5、std::placeholders表示新的可调用对象的第几个参数和原函数的第几个参数进行匹配
六、详细代码参考
链接:https://pan.baidu.com/s/1qZbbKNM 密码:anm9
参考: