【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;
}
相关推荐
桦说编程2 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅4 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者5 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺5 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
倔强的石头_5 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
Derek_Smart6 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP7 小时前
MyBatis-mybatis入门与增删改查
java
肆忆_8 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
孟陬10 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端