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

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

一.bind(绑定包装器)

【1】基本概念

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

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

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

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

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…的顺序走
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()
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;
}


相关文章
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
11月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
2629 1
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
1343 0
|
设计模式 安全 数据库连接
【C++11】包装器:深入解析与实现技巧
本文深入探讨了C++中包装器的定义、实现方式及其应用。包装器通过封装底层细节,提供更简洁、易用的接口,常用于资源管理、接口封装和类型安全。文章详细介绍了使用RAII、智能指针、模板等技术实现包装器的方法,并通过多个案例分析展示了其在实际开发中的应用。最后,讨论了性能优化策略,帮助开发者编写高效、可靠的C++代码。
541 2
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
454 4
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
4456 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
386 0
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码

热门文章

最新文章