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

在这里插入图片描述

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

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

在这里插入图片描述

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


一、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代表函数包装器的第几个参数,所处位置代表原函数的第几个参数,这个比较难理解,敲敲代码就明白了

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的张同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值