ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++11 标准库 bind 函数

2021-12-13 15:35:50  阅读:112  来源: 互联网

标签:11 std 函数 int bind C++ placeholders include


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;
}

调试结果:

结束

学无止境

标签:11,std,函数,int,bind,C++,placeholders,include
来源: https://www.cnblogs.com/lvvou/p/15682910.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有