std::bind 创建函数对象的绑定器,将函数的参数绑定到特定值从而创建一个新的可调用对象
std::bind是C++标准库中的一个函数模板,用于创建函数对象(函数指针或成员函数指针)的绑定器。它可以将函数的参数绑定到特定的值,从而创建一个新的可调用对象。
std::bind
函数接受一个可调用实体作为第一个参数,然后是一系列要绑定到可调用实体的参数。它返回一个新的可调用对象,当调用该对象时,将使用绑定的参数调用原始的可调用实体。
std::bind的语法如下:
std::bind(Function&& f, Args&&... args)
其中,Function
是要绑定的函数或成员函数的类型,args
是要绑定的参数。
示例用法:
#include <functional>
#include <iostream>
void foo(int a, int b) {
std::cout << "Sum: " << a + b << std::endl;
}
class Bar {
public:
void barFunc(int a, int b) {
std::cout << "Product: " << a * b << std::endl;
}
};
int main() {
auto bindFoo = std::bind(foo, 10, 20);
bindFoo(); // 输出:Sum: 30
Bar barObj;
auto bindBar = std::bind(&Bar::barFunc, &barObj, 5, 6);
bindBar(); // 输出:Product: 30
return 0;
}
在上述示例中,我们使用std::bind分别创建了两个绑定器bindFoo和bindBar。bindFoo绑定了函数foo,并将参数10和20绑定到了该函数上,所以调用bindFoo()时会输出Sum: 30。
bindBar绑定了类Bar的成员函数barFunc,并将参数5和6绑定到了该成员函数上,所以调用bindBar()时会输出Product: 30。
注意,对于成员函数的绑定,需要使用成员函数指针和对象指针。
std::bind也可以用于在类内中,将回调函数作为函数参数时进行绑定:
AddConnection(_a, std::bind(&class::method,this,std::placeholders::_1), b, c);
其中,std::bind(&class::method,std::placeholders::_1)
为创建的新的可调用对象,class为该类的类名,method为类内的一个自定义非静态成员函数。
在C++中,类内非静态成员函数默认会有第一个参数为this
,因此将method的第一个参数绑定到this,并使用std::placeholders::_1
保留第二个参数的位置,这个保留的参数会在调用时调用提供的参数。