C++11 标准库 bind 函数
2021/12/13 17:17:05
本文主要是介绍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 << fun1(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; }
调试结果:
结束
学无止境
这篇关于C++11 标准库 bind 函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-04el-table 开启定时器下,表格的选中状态会消失是什么原因-icode9专业技术文章分享
- 2024-10-03如何安装和初始化飞牛私有云 fnOS?-icode9专业技术文章分享
- 2024-10-03如何安装 App 并连接到飞牛 NAS?-icode9专业技术文章分享
- 2024-10-03如何安装飞牛 TV 并连接到影视服务器?-icode9专业技术文章分享
- 2024-10-03如何在PVE和ESXI上安装飞牛私有云 fnOS?-icode9专业技术文章分享
- 2024-10-03fnOS国产最强NAS安装系统异常情况处理-icode9专业技术文章分享
- 2024-10-03飞牛NAS如何创建存储空间?-icode9专业技术文章分享
- 2024-10-03fnOS国产最强NAS硬盘会自动休眠吗?-icode9专业技术文章分享
- 2024-10-03fnOS国产最强NAS如何安装飞牛影视和创建媒体库?-icode9专业技术文章分享
- 2024-10-03fnOS国产最强NAS如何为家人朋友开通影视账号?-icode9专业技术文章分享