[C/C++]std::bind简介

std::bind函数的:
将指定的可调用的实体(函数,变量)的参数绑定到已有的变量,或者常量里面,产生一个新的可调用实体(不是直接取原函数的地址,而是构造出一个全新的函数)。返回的是一个类型安全的函数类型,可以用auto变量去接(局部变量),或者用std::function类(类的成员)去接收即可。
其实就是后者更加正式一点,前者就随意一些。绑定的内容是值传递,可以是变量或者是常量值,而用placeHolder进行绑定的话,是引用参数,应该是const 引用类型。如果是成员函数的绑定,this指针可以通过绑定对象或者指针来进行绑定。通常绑定一个类的成员函数的第二个参数,就是this,需要传递具体的一个对象进去的,或者如果本来就是成员函数中进行bind的话,直接传递this进去就行了。
其实一般情况下,都是一个空值,只要那个被绑定函数没有操作this即可。这种重新生成的好处,就是用于回调函数。相当于新生成一个和当前类无关的函数,可以送给其他类,进行调用,这样其他类就可以通过函数访问本类所对应的对象的一系列数据。
常见的一个应用:一个类的对象需要获取到另一个类的对象所存储的数据,比如Session数据,可以在第一个类中定义一个std::function成员变量,在类2的对象生成类1对象的时候,对类1的function成员进行赋值(bind一个新的函数给std::function)。相当于在一个成员函数中创造一个函数,给类1的对象。即在对象创建的时候,进行动态生成的函数。通过bind进行。之所以这么做,是因为函数地址在静态的时候还不知道,只有类2的对象生成之后,才能知道具体需要调用哪个函数。这个就是回调函数。比如framework会在开始初始化很多回调函数。就是需要动态绑定的时候进行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的std::bind是一个函数模板,用于创建一个可调用对象(函数对象或成员函数指针),并绑定参数。它可以将一个函数或成员函数与一组参数绑定在一起,形成一个新的可调用对象。 std::bind的基本语法如下: ```cpp std::bind(Function, args...) ``` 其中,Function是要绑定函数或成员函数指针,args是要绑定参数。 使用std::bind可以实现以下功能: 1. 绑定普通函数的部分参数,生成一个新的可调用对象。 2. 绑定成员函数的对象指针和部分参数,生成一个新的可调用对象。 3. 绑定成员函数的对象引用和部分参数,生成一个新的可调用对象。 下面是一些示例: 1. 绑定普通函数的部分参数: ```cpp #include <iostream> #include <functional> void printSum(int a, int b) { std::cout << "Sum: " << a + b << std::endl; } int main() { auto printSumWith5 = std::bind(printSum, 5, std::placeholders::_1); printSumWith5(10); // 输出:Sum: 15 return 0; } ``` 2. 绑定成员函数的对象指针和部分参数: ```cpp #include <iostream> #include <functional> class MyClass { public: void printProduct(int a, int b) { std::cout << "Product: " << a * b << std::endl; } }; int main() { MyClass obj; auto printProductWith2 = std::bind(&MyClass::printProduct, &obj, std::placeholders::_1); printProductWith2(5); // 输出:Product: 10 return 0; } ``` 3. 绑定成员函数的对象引用和部分参数: ```cpp #include <iostream> #include <functional> class MyClass { public: void printDifference(int a, int b) { std::cout << "Difference: " << a - b << std::endl; } }; int main() { MyClass obj; auto printDifferenceWith3 = std::bind(&MyClass::printDifference, std::ref(obj), std::placeholders::_1); printDifferenceWith3(7); // 输出:Difference: 4 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值