std::bind:将可调用对象和其参数绑定成一个防函数

本文详细介绍了C++11中的std::bind函数,它是一个通用的函数适配器,可以将可调用对象与参数绑定。通过std::bind,可以创建新的可调用对象,实现对函数或成员函数的部分参数绑定。示例中展示了如何绑定普通函数和成员函数,并使用std::placeholders::_1作为占位符。此外,还讨论了std::bind在成员函数绑定时的注意事项,如需要显示指定成员函数指针和对象地址。
摘要由CSDN通过智能技术生成

介绍:
可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存

作用:

  1. 将可调用对象和其参数绑定成一个防函数
  2. 只绑定部分参数,减少可调用对象传入的参数(可用lambda匿名函数包裹原函数时传入参数代替)

代码示例:
1、std::bind绑定普通函数

double my_divide (double x, double y) {return x/y;}      
auto fn_half = std::bind (my_divide,_1,2);  // auto 即时function指针      
std::cout << fn_half(10) << '\n';                        // 5

bind的第一个参数是函数名,普通函数做实参时,会隐式转换成函数指针。因此std::bind (my_divide,_1,2)等价于std::bind (&my_divide,_1,2)_1表示占位符,位于<functional>中,std::placeholders::_1

2、std::bind绑定一个成员函数

struct Foo {    
	void print_sum(int n1, int n2)    
	{    
	std::cout << n1+n2 << '\n'; 
	}  
	int data = 10; 
};  
int main() 
{     
	Foo foo;    
	auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1); 
	f(5); // 100 
} 

bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址
必须显示的指定&Foo::print_sum,因为编译器不会将对象的成员函数隐式转换成函数指针,所以必须在Foo::print_sum前添加&; 使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数为对象的地址 &foo

参考资料:
1、C++11 中的std::function和std::bind
2、stack overflow :How std::bind works with member functions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值