C++新特性(四)函数对象包装器function与bind

1,函数对象包装器

函数对象包装器的意思是将整个函数包装起来,包装成一个容器,以后要使用该函数的时候只需要调用该容器即可。
头文件#include<functional>
例子:
在这里插入图片描述
函数对象包装器支持4种函数的包装,使得函数的表达都成了一个统一的整体。
1,普通函数
2,匿名函数
3,普通成员函数
4,仿函数(重载了运算符()的函数)
其中1的对象包装已经演示过,而下面的代码演示了全部四种函数的包装。读者可直接通过运行下面代码理解

#include<iostream>
#include<functional>
using namespace std;

void test(int i)
{
	cout << "普通函数中i=" <<i<< endl;
}

class A {
public:
	void myfun(int i) {
		cout << "成员函数myfun中i=" << i << endl;
	}

	int operator()(int i) {//重载了()运算符
		cout << "仿函数中i=" << i << endl;
		return i;
	}
};
int main()
{
	function<void(int)> f = test;  //函数对象包装器f将void test(int i) 包装
	f(10);//通过函数对象包装器调用函数

	function<int(int)> f1 = [](int i)->int {
		cout<< "成员函数myfun中i=" << i << endl;
		return i;
	};
	f1(11);

	function<void(A*, int)>f2 = &A::myfun;//注意,成员函数其实还有参数this指针
	A obj;
	f2(&obj, 12);

	function<int(A*, int)>f3 = &A::operator();
	f3(&obj, 13);
}

2,bind机制

bind机制和前面学过的函数的默认参数有点相似,都是指定了默认参数。而原来的默认参数是只能提前指定后n位的参数为默认参数并设定默认值;bind机制则是可以绑定某些特定的参数为特定值。具体用法看下面的示例:

#include<iostream>
#include<functional>
using namespace std;

void bindtest(int a, int b, int c)
{
	cout << "a="<<a <<' ' << "b=" << b <<' '<< "c="<< c<<endl;
}
int main()
{

	auto g = bind(bindtest, 1, 2, 3);//指定a,b,c参数默认为1,2,3
	auto g1 = bind(bindtest, 1, placeholders::_1, 3);//指定a,c的默认参数为1,3,b的参数运行时确定
	auto g2= bind(bindtest, placeholders::_2, placeholders::_1, 3);//指定c的默认参数为3,a,b的参数运行时确定,
	      //且注意 placeholders::_2, placeholders::_1,分别代表函数调用时候的第二个参数以及第一个参数
	g();
	g1(2);
	g2(1, 2);

}
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橡秄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值