C++11 标准库 bind 函数

C++11 标准库 bind 函数

bind 是什么?

bind 顾名思义: 绑定
通俗来讲呢,可以这么理解有点像函数指针的意思。
资料上是这么讲的:可以将 bind 函数看做一个通用函数的适配器,它接受一个可调用对象,生成一个新的可以调用对象来“适应”原对象参数列表

它一般调用形式:

// 其中 newCallable 是一个可调用的对象, arg_list 是以逗号分隔的参数列表// 这时我们调用 newCallable,newCallable 就会调用 callable, 并用 arg_list 传递参数auto newCallable = bind(callable, arg_list);

好了,重点在于 arg_list 里,那么我们如何传入参数呢
它们是靠这些参数的位置识别的,形如 _n 之类的, n 是整形, _1 是第一个参数,_2是第二个参数,以此类推。
名字 _n 是定义在 placeholders 命名空间中, 而 placeholders 本身又定义在 std 命名空间中, 所以形如:
using std:: placeholders::_1

接下来,我们举例几个列子

举个栗子

bind 是在头文件 #include <functional> 中, 首先要包含它。

1. bind 无参数的普通函数

#include <iostream>#include <functional> // 包含此头文件// 普通函数void Fun(){std::cout << "I am Fun!" << std::endl;}// 主函数int main(){auto fun = std::bind(Fun); // 适配 Fun 函数并返回一个可调用的对象fun();return 0;}

调试结果:

2. bind 1个参数的普通函数

#include <iostream>#include <functional> // 包含此头文件// 普通函数void Fun(int a){std::cout << "I am Fun! a = " << a <<std::endl;}// 主函数int main(){auto fun = std::bind(Fun, std::placeholders::_1); fun(5);return 0;}

调试结果:

3. bind 多个参数的普通函数

#include <iostream>#include <functional> // 包含此头文件// 普通函数int Fun(int a, int b){return a - b;}// 主函数int main(){auto fun = std::bind(Fun, std::placeholders::_1, std::placeholders::_2); std::cout << fun(5, 2) << std::endl;return 0;}

调试结果:

4. bind 多个参数的普通函数并打乱参数位置

#include <iostream>#include <functional> // 包含此头文件// 普通函数int Fun(int a, int b){return a - b;}// 主函数int main(){auto fun1 = std::bind(Fun, std::placeholders::_1, std::placeholders::_2);auto fun2 = std::bind(Fun, std::placeholders::_2, std::placeholders::_1);std::cout << fun1(5, 2) << std::endl;std::cout << fun2(5, 2) << std::endl;return 0;}

调试结果:

5. bind 类的成员函数

#include <iostream>#include <functional> // 包含此头文件class MyClass {public:MyClass() {}~MyClass() {}public:void printInfo() {std::cout << "MyClass Info." << std::endl;}};// 主函数int main(){MyClass A;auto fun = std::bind(&MyClass::printInfo, A);fun();return 0;}

调试结果:

再举个应用栗子

#include <iostream>#include <functional> // 包含此头文件typedef std::function<void(int)> CallbackType;// A 类class MyClassA {public:void regeditCallBack(CallbackType fun){ _callback_fun = fun; }void printInfoA(int d) { _callback_fun(d); }private:CallbackType _callback_fun;};// B 类class MyClassB {public:void printInfoB(int d) {std::cout << d << std::endl;}};// 主函数int main(){MyClassB B;auto funB = std::bind(&MyClassB::printInfoB, B, std::placeholders::_1);MyClassA A;A.regeditCallBack(funB);A.printInfoA(1);return 0;}

调试结果:

结束

学无止境

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部