【C++】bind绑定包装器全解(代码演示,例题演示)

前言

大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁

主要内容含:

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

目录

一.bind(绑定包装器)

【1】基本概念

  • std::bind函数定义在头文件中,是一个 函数模板 ,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来"适应"原对象的参数列表
  • 一般主要应用于:实现参数顺序调整等操作

【2】bind实现参数顺序调整的规则示意图

  • 如图中所示:
  • 同样的rSub(10,5)通过变换bind函数包装器placeholders::_1, placeholders::_2,可以实现10-5&5-10

【3】bind的一个基本应用场景:不同利率计算(引入变量rate)

cpp 复制代码
double Plus(int a, int b, double rate)
{
	return (a + b) * rate;
}

int main()
{
	function<double(int, int)> Plus1 = bind(Plus, placeholders::_1, placeholders::_2, 4.0);
	function<double(int, int)> Plus2 = bind(Plus, placeholders::_1, placeholders::_2, 4.2);
	function<double(int, int)> Plus3 = bind(Plus, placeholders::_1, placeholders::_2, 4.4);

	cout << Plus1(5, 3) << endl;
	cout << Plus2(5, 3) << endl;
	cout << Plus3(5, 3) << endl;
	return 0;
}

【4】placeholders::_1, placeholders::_2无视bind函数包装器的常量位置:按顺序1,2,3...

  • 如下图所示:
  • 即使rate参数放在bind包装器的中间,依然按照placeholders::_1,_2,_3...的顺序走
cpp 复制代码
double Plus(int a, double rate,int b)
{
	return (a + b) * rate;
}

int main()
{
	function<double(int, int)> Plus1 = bind(Plus, placeholders::_1,  4.0 placeholders::_2);
	function<double(int, int)> Plus2 = bind(Plus, placeholders::_1, 4.2,placeholders::_2);
	function<double(int, int)> Plus3 = bind(Plus, placeholders::_1,4.4 ,placeholders::_2);

	cout << Plus1(5, 3) << endl;
	cout << Plus2(5, 3) << endl;
	cout << Plus3(5, 3) << endl;
	return 0;
}

【5】bind绑定成员函数(静态/非静态)

主要方法分为下面三种:

  1. 对于静态成员函数,直接取类的地址即可&SubType::sub
  2. 对于非静态成员函数,在直接取类的地址的基础上&SubType::sub,法一:先实例化出一个类SubType st;,取其地址&st
  3. 在直接取类的地址的基础上&SubType::sub,法二:直接传入一个匿名对象SubType()
cpp 复制代码
class SubType
{
public:
	static int sub(int a, int b)
	{
		return a - b;
	}

	int ssub(int a, int b, int rate)
	{
		return (a - b) * rate;
	}
};

int main()
{
//对于静态成员函数
	function<double(int, int)> Sub1 = bind(&SubType::sub, placeholders::_1, placeholders::_2);
		cout << Sub1(1, 2) << endl;
//对于非静态成员函数,法一
	  SubType st;
	function<double(int, int)> Sub2 = bind(&SubType::ssub, &st, placeholders::_1, placeholders::_2, 3);
    	cout << Sub2(1, 2) << endl;
//对于非静态成员函数,法二
	function<double(int, int)> Sub3 = bind(&SubType::ssub, SubType(), placeholders::_1, placeholders::_2, 3);
    	cout << Sub3(1, 2) << endl;
 
	return 0;
}
相关推荐
从此不归路1 天前
Qt5 进阶【11】图形视图框架:用 QGraphicsView 搭一个流程图编辑器
开发语言·c++·qt
三水不滴1 天前
Redis 持久化机制
数据库·经验分享·redis·笔记·缓存·性能优化
lusasky1 天前
Claude Code v2.1.0+ 版本集成LSP
大数据·数据库·人工智能
难得的我们1 天前
单元测试在C++项目中的实践
开发语言·c++·算法
weixin199701080161 天前
加盟网 item_search - 根据关键词获取行业列表接口对接全攻略:从入门到精通
java·python
EliseL1 天前
SuperMap iObjects Java 如何将3DTiles数据转换为S3M三维瓦片
java·3d·三维
cyforkk1 天前
11、Java 基础硬核复习:常用类和基础API的核心逻辑与面试考点
java·python·面试
全栈师1 天前
java和C#的基本语法区别
java·开发语言·c#
凯子坚持 c1 天前
Qt常用控件指南(7)
服务器·数据库·qt
diediedei1 天前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python