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");
}

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


相关文章
|
23天前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
14 1
|
1月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
18 6
|
1月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
27 0
c++学习笔记05 函数
|
2月前
|
C++ 运维
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
35 11
|
30天前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
30 0
|
1月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
1月前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
1月前
|
JavaScript C++
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
|
2月前
|
Rust 编译器 测试技术
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
|
2月前
|
Java C++ 运维
开发与运维函数问题之C++中有哪些继承方式如何解决
开发与运维函数问题之C++中有哪些继承方式如何解决
22 0