C++中bind函数的用法

bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。C++98中,有两个函数bind1st和bind2nd,它们分别可以用来绑定functor的第一个和第二个参数,它们都是只可以绑定一个参数。各种限制,使得bind1st和bind2nd的可用性大大降低。C++0x中,提供了std::bind,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制,由用户指定,这个bind才是真正意义上的绑定,有了它,bind1st和bind2nd就没啥用武之地了,因此C++0x中不推荐使用bind1st和bind2nd了,都是deprecated了。下面我们通过例子,来看看bind的用法:

#include < functional>
 
int Func(int x, int y);
auto bf1 = std::bind(Func, 10, std::placeholders::_1);
bf1(20); ///< same as Func(10, 20)
 
class A
{
public:
    int Func(int x, int y);
};
 
A a;
auto bf2 = std::bind(&A::Func, a, std::placeholders::_1, std::placeholders::_2);
bf2(10, 20); ///< same as a.Func(10, 20)
 
std::function< int(int)> bf3 = std::bind(&A::Func, a, std::placeholders::_1, 100);
bf3(10); ///< same as a.Func(10, 100)

上面的例子中,bf1是把一个两个参数普通函数的第一个参数绑定为10,生成了一个新的一个参数的可调用实体体; bf2是把一个类成员函数绑定了类对象,生成了一个像普通函数一样的新的可调用实体; bf3是把类成员函数绑定了类对象和第二个参数,生成了一个新的std::function对象。看懂了上面的例子,下面我们来说说使用bind需要注意的一些事项:

  • (1)bind预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的
  • (2)对于不事先绑定的参数,需要传std::placeholders进去,从_1开始,依次递增。placeholder是pass-by-reference的
  • (3)bind的返回值是可调用实体,可以直接赋给std::function对象
  • (4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前,这些参数是可用的
  • (5)类的this可以通过对象或者指针来绑定

参考地址:https://blog.csdn.net/crayondeng/article/details/9996625

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++11bind函数是一个非常有用的函数,它可以将一个函数和一组参数绑定起来,生成一个新的函数对象。这个新的函数对象可以像原始函数一样调用,并且可以在调用时传入剩余的参数。bind函数通常用于将一个函数作为回调函数传递给其他函数或对象。 bind函数的基本用法如下: ```c++ #include <functional> int add(int x, int y) { return x + y; } int main() { auto add5 = std::bind(add, 5, std::placeholders::_1); // add5是一个新的函数对象,它将add函数和参数5绑定起来 // _1表示占位符,表示在调用add5时需要传入一个参数 int result = add5(3); // 调用add(5, 3),返回8 return 0; } ``` 在这个例子,我们定义了一个add函数,然后使用bind函数将add函数和参数5绑定起来,生成一个新的函数对象add5。add5函数对象只需要传入一个int类型的参数,它就可以调用add函数,并返回add函数的计算结果。 除了使用占位符来绑定部分参数外,bind函数还可以使用std::ref函数将一个变量转换成一个引用,并将这个引用作为函数的参数进行绑定。例如: ```c++ #include <functional> void print(int& x) { std::cout << x << std::endl; } int main() { int x = 10; auto print_x = std::bind(print, std::ref(x)); // print_x是一个新的函数对象,它将print函数和x的引用绑定起来 x = 20; print_x(); // 调用print(x),输出20 return 0; } ``` 在这个例子,我们定义了一个print函数,它需要一个int类型的引用作为参数。然后使用bind函数将print函数和x的引用绑定起来,生成一个新的函数对象print_x。在调用print_x时,它会自动使用x的引用作为参数调用print函数,并输出x的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值