前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】bind绑定包装器全解(代码演示,例题演示)

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

作者头像
YY的秘密代码小屋
发布2024-01-23 10:15:46
1070
发布2024-01-23 10:15:46
举报
文章被收录于专栏:C++系列C++系列
在这里插入图片描述
在这里插入图片描述

一.bind(绑定包装器)

【1】基本概念

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

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

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

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

代码语言:javascript
复制
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…的顺序走
代码语言:javascript
复制
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()
代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.bind(绑定包装器)
    • 【1】基本概念
      • 【2】bind实现参数顺序调整的规则示意图
        • 【3】bind的一个基本应用场景:不同利率计算(引入变量rate)
          • 【4】placeholders::_1, placeholders::_2无视bind函数包装器的常量位置:按顺序1,2,3…
            • 【5】bind绑定成员函数(静态/非静态)
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档