> 文章列表 > C++函数适配器和函数包装器:让你的函数更灵活

C++函数适配器和函数包装器:让你的函数更灵活

C++函数适配器和函数包装器:让你的函数更灵活

C++函数适配器和函数包装器:让你的函数更灵活

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:c++

🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾

在这里插入图片描述

前言:这次给大家带来的是C++函数适配器和函数包装器,它可以让你的让你的函数更灵活,更加易用

文章目录

      • 一、C++函数适配器
        • 1、绑定普通函数
        • 2、绑定类中成员函数
      • 二、C++函数包装器
        • 1、简单包装
        • 2、函数包装器与函数适配器之间的激情

一、C++函数适配器

函数适配器: 就是bind函数,操作函数指针,让函数指针能够适应回调函数的参数,简单来说就是让函数指针存在不同的调用形态

1、绑定普通函数

在这里插入图片描述

void print(int a,int b,int c)
{cout << a << " " << b << " " << c << endl;
}
template <class _Pr> void printData(_Pr _pr, int a, int b) 
{_pr(a, b);
}
void testOne()
{void(*p)(int, int, int) = print;p(1, 2, 3);//printData(print, 2, 4); //print不适用printDataauto king = bind(print, placeholders::_1, placeholders::_2, 8);printData(king, 2, 4);  //适配完成后适用auto p1 = bind(print, 8, 8, 8);p1();//条件筛选vector<int> info = { 55,64,79,23,10,23,1589,564,3212,0,11,1,33 };auto test = count_if(info.begin(), info.end(), [](int& nums) {return nums >= 1000; });auto test1 = count_if(info.begin(), info.end(), bind(greater_equal<int>(), placeholders::_1, 1000));cout << test << " " << test1 << endl;
}

2、绑定类中成员函数

在这里插入图片描述

class Test 
{
public:void printTest(int a,int b,int c) {cout << a << " " << b << " " << c << endl;}
};
void testTwo()
{//绑定类中成员函数Test test;auto king = &Test::printTest;(test.*king)(1, 3, 4);auto info = bind(&Test::printTest, &test, placeholders::_1, 8, 9);info(5);
}

二、C++函数包装器

函数包装器就是就是把函数指针包装成为一个对象,function

  • function object(pFunc);
  • function object=pFunc;

type:函数返回值类型(参数类型),举例包装int sum(int a,int b); type是: int(int,int)

怎么通过包装后的对象调用函数,直接把包装器对象当做函数名即可

1、简单包装

在这里插入图片描述

int Max(int a, int b) 
{return a > b ? a : b;
}
class Test 
{
public:void operator()(string info) {cout << info << endl;}static void print(int a, int b) {cout << a + b << endl;}using _Pr = void(*)(int, int);operator _Pr() {return print;}
};
void testOne() 
{//普通函数的包装function<int(int, int)> test = Max;cout << test(1, 2) << endl;//仿函数的包装Test king;function<void(string)> func = king;func("仿函数");//包装operator隐式对象转换的指针function<void(int, int)> _Pr = king;king(2, 3);
}

2、函数包装器与函数适配器之间的激情

在这里插入图片描述

void testTwo() 
{//正常function<void(int, double)> test = bind(printData, placeholders::_1, placeholders::_2, "正常");test(1,2.2);function<void(double, int)> king = bind(printData, placeholders::_2, placeholders::_1, "不正常");king(2.2, 1);//参数调整function<void(string, double, int)> info = bind(printData, placeholders::_3, placeholders::_2, placeholders::_1);info("参数调整", 2.2, 1);
}

function<void(string, double, int)> info =

bind(printData, placeholders::_3, placeholders::_2, placeholders::_1);

详解参数调整,实际是就是函数包装器的第三个参数是原函数的第一个参数,函数包装器的第二个参数是原函数的第二个参数,函数包装器的第一个参数是原函数的第三个参数

_1代表函数包装器的第几个参数,所处位置代表原函数的第几个参数,这个比较难理解,敲敲代码就明白了