转自:https://blog.csdn.net/Jxianxu/article/details/107382049
1.介绍
std::bind的头文件是 <functional>,它是一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind返回一个基于f的函数对象,其参数被绑定到args上。f的参数要么被绑定到值,要么被绑定到placeholders(占位符,如_1, _2, ..., _n)。
主要作用:
- 将可调用对象和其参数绑定成一个仿函数;
- 只绑定部分参数,减少可调用对象传入的参数。
2.绑定普通函数
double callableFunc (double x, double y) {return x/y;} auto NewCallable = std::bind (callableFunc, std::placeholders::_1,2); std::cout << NewCallable (10) << '\n';
- bind的第一个参数是函数名,普通函数做实参时,会隐式转换成函数指针。因此std::bind(callableFunc,_1,2)等价于std::bind (&callableFunc,_1,2);
- _1表示占位符,位于<functional>中,std::placeholders::_1;
- 第一个参数被占位符占用,表示这个参数以调用时传入的参数为准,在这里调用NewCallable时,给它传入了10,其实就想到于调用callableFunc(10,2);
3.绑定类对象的成员函数
class Base { void display_sum(int a1, int a2) { std::cout << a1 + a2 << '\n'; } int m_data = 30; }; int main() { Base base; auto newiFunc = std::bind(&Base::display_sum, &base, 100, std::placeholders::_1); f(20); // should out put 120. }
- bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址。
- 必须显示的指定&Base::diplay_sum,因为编译器不会将对象的成员函数隐式转换成函数指针,所以必须在Base::display_sum前添加&;
- 使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数为对象的地址 &base;
4.绑定引用参数
如果函数声明中的形参类型是引用,那么在bind时可以通过ref()函数来绑定参数。
标签:std,函数,对象,bind,绑定,学习,参数 From: https://www.cnblogs.com/BlueBlueSea/p/16725788.html