bind函数的使用详解
可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
bind其实是一个模板参数:
template <class _Fx, class... _Types>
_NODISCARD _CONSTEXPR20 _Binder<_Unforced, _Fx, _Types...>
bind(_Fx&& _Func, _Types&&... _Args) {
return _Binder<_Unforced, _Fx, _Types...>
(_STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...);
}
template <class _Ret, class _Fx, class... _Types>
_NODISCARD _CONSTEXPR20 _Binder<_Ret, _Fx, _Types...>
bind(_Fx&& _Func, _Types&&... _Args) {
return _Binder<_Ret, _Fx, _Types...>
(_STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...);
}
基本函数和类的构造
class A
{
public:
int print(int a)
{
cout << "print(int a)" << endl;
return a;
}
static int printt(int a)
{
cout << "printt(int a)" << endl;
return a;
}
static int num;
int a=100;
};
int A::num = 100;
void print(int a)
{
cout << "print(int a)" << endl;
}
struct B
{
int operator()(int a)
{
cout << "operator(int a)" << endl;
return a;
}
};
bind对普通函数的构造
auto func = bind(print, placeholders::_1);//这个placeholders是作用域对象
//_1表示的是这是一个可变的参数如果填了值则表示这个值一定
func(10);
bind对类静态的函数的使用
auto func1 = bind(A::printt,placeholders::_1);//类的静态函数不需要指定类,因为他的地址是不在类中的,在静态全局区
func1(12);
bind对类成员变量的访问
auto func2 = bind(&A::a,a);//当你是要一个类的成员函数或变量时就需要指定这个类的对象
cout << func2() << endl;
bind对类的普通函数的访问
auto func3 = bind(&A::print, a, placeholders::_1);
cout << func3(12) << endl;
bind对类仿函数的访问
auto func4 = bind(b, placeholders::_1);//这个b是一个类对象,相当于绑定了这个类对象的,再去访问operator()
()这个函数
cout << func4(122) << endl;