C++函数适配器

简介: C++函数适配器

什么是函数适配器

函数适配,就是让函数指针调用的时候,函数后绑定特定的参数,从而让函数指针存在多种的调用形态。

bind函数基本用法

bind(),第一个参数是函数名,第二个参数可以是 std::placeholders::_1(表示占位第一个参数)–>参数不固定,可以通过传参,当然也有std :: placeholders::_2…

绑定普通函数

#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int Max(int a, int b)
{
  return a > b ? a : b;
}
int main()
{
  //std :: placeholders ::_ 1 占位符
  auto p = bind(Max, std::placeholders::_1, 122);
  cout << p(1) << endl;  //第二个参数固定,只需要传第一个参数就行

绑定类中成员函数指针

1.bind(),第一个参数写类名限定的函数名,第二个参数&对象

2.学习使用函数指针

#include<iostream>
#include<functional>
#include<string>
#include<algorithm>
using namespace std;
class Test
{
public:
  void printDate(int a, int b, int c)
  {
    cout << a + b + c << endl;
  }
};
int main()
{
  //绑定类中成员函数指针
  Test test;
  auto fun = bind(&Test ::printDate, &test, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
  fun(1, 2, 3);
  //成员函数指针的使用
  //方法一:用auto推断
  auto fun1 = &Test::printDate;
  (test.*fun1)(1, 2, 3);
  //方法二:直接写
  void(Test :: * p1)(int a, int b, int c);
  p1 = &Test::printDate;
  (test.*p1)(1, 2, 8);
  void(Test:: * p2)(int a, int b, int c) = &Test::printDate;
  (test.*p2)(2, 4, 9);
  system("pause");
  return 0;
}

绑定仿函数

结合一些算法使用

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
  vector<int> date = { 46, 89, 17, 89, 90 };
  auto fun = count_if(date.begin(), date.end(), bind(less<int>(), std::placeholders::_1, 60));
  cout << "小于60的人数" << fun << endl;
  system("pause");
  return 0;
}

结合包装器使用

include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
void Date(int a, string b, double c)
{
  cout << "函数适配器和包装器的结合" << endl;
}
int main()
{
  //正常包装
  function<void(int, string, double)> fun2;
  fun2(1, "2", 1.1);
  //正常适配 (一个参数固定的话,这里类型也要写2个)
  function<void(int, string)> fun1 = bind(Date, std::placeholders::_1, std::placeholders::_2, 1.11);
  fun1(1, "3");
  //可以改变参数的位置
  function<void(string, int)> fun3 = bind(Date, std::placeholders::_2, std::placeholders::_1, 1.11);
  fun3("2", 1);
  //这里改变了第一个参数和第二个参数的位置,同时第三个参数固定
  return 0;
  system("pause");
}

函数适配器和包装器,在实际使用中可能很少用到,但我们必须要了解,学会使用。


相关文章
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
85 0
|
6月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
329 6
|
11月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
11月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
427 6
|
10月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
148 0
|
11月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
105 3
|
11月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
172 0
C++ 多线程之线程管理函数
|
11月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
78 3
|
11月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
1936 1
|
11月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
138 1