📖作者介绍: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不适用printData
auto 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代表函数包装器的第几个参数,所处位置代表原函数的第几个参数,这个比较难理解,敲敲代码就明白了