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


相关文章
|
27天前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
24 1
|
2月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
37 5
|
2月前
|
C++
C++代码的可读性与可维护性:技术探讨与实践
C++代码的可读性与可维护性:技术探讨与实践
29 1
|
8天前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
20 5
|
10天前
|
C语言 图形学 C++
|
21天前
|
C++
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
c++primer plus 6 读书笔记 第十四章 C++中的代码重用
|
23天前
|
存储 API C语言
C/C++爱心代码
C/C++爱心代码
53 2
|
27天前
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
16 1
|
10天前
|
编译器 C语言 C++
|
2月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
28 2