C++11标准库bind函数应用教程
短信预约 -IT技能 免费直播动态提醒
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函数应用教程的文章就介绍到这了,更多相关C++11 bind函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341