这里写目录标题
std::bind
std::bind定义在头文件 functional
里 。
template<typename _Func, typename... _BoundArgs>
inline typename
_Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type
bind(_Func&& __f, _BoundArgs&&... __args)
template<typename _Result, typename _Func, typename... _BoundArgs>
inline
typename _Bindres_helper<_Result, _Func, _BoundArgs...>::type
bind(_Func&& __f, _BoundArgs&&... __args)
std::bind 用于生成可调用实体的转发调用包装器,调用此包装器等价于以一些绑定到 args 的参数调用可调用实体。
可调用实体包括:普通函数、Lambda表达式、bind表达式、函数指针、函数引用以及其它函数对象。
参数 __args
表示要绑定的参数列表。未绑定参数使用命名空间 std::placeholders
的占位符 _1
, _2
, _3
等替换。
需要注意的是:
- bind预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的。除非该参数被std::ref或者std::cref包装,才pass-by-reference。
- 对于不事先绑定的参数,需要传std::placeholders进去,从_1开始,依次递增。placeholder是pass-by-reference的。
- bind的返回值是可调用实体,可以直接赋给std::function对象。
- 对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前,这些参数是可用的。
- 类的this指针可以通过对象或者指针来绑定。
一个std::bind使用的例子如下:
#include <random>
#include <iostream>
#include <memory>
#include <functional>
void f(int n1, int n2, int n3, const int& n4, int n5)
{
std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 <<