而 std::bind 则是用来绑定函数调用的参数的,它解决的需求是我们有时候可能并不一定能够一次性获得调用某个函数的全部参数,通过这个函数,我们可以将部分调用参数提前绑定到函数身上成为一个新的对象,然后在参数齐全后,完成调用。例如:
#include<functional>
#include<iostream>
int foo(int a, int b) {
return a + b;
}
class Mybind {
public:
int operator()(int a, int b)
{
return a + b;
}
};
int main() {
// 1.将参数一:100绑定到函数 foo 上,但是使用 std::placeholders::_1 来对第一个参数进行占位
auto bindFoo = std::bind(foo, std::placeholders::_1, 100);
// 这时调用 bindFoo 时,只需要提供第一个参数即可
std::cout << bindFoo(50) << std::endl;
// 2.将参数一:100绑定到lambda上,但是使用 std::placeholders::_1 来对第一个参数进行占位
auto f1 = std::bind([](int a, int b)->int {return a + b; }, std::placeholders::_1, 100);
std::cout << f1(50) << std::endl;
// 3.将参数一:100绑定到对象上,但是使用 std::placeholders::_1 来对第一个参数进行占位
Mybind m;
auto f2 = std::bind(m, std::placeholders::_1, 100);
std::cout << f2(50) << std::endl;
std::cin.get();
return 0;
}
提示:注意 auto 关键字的妙用。有时候我们可能不太熟悉一个函数的返回值类型,但是我们却可以通过 auto 的使用来规避这一问题的出现。
其中:绑定参数技术多用于设计模式中的适配器模式