C++ bind-绑定一切函数

bind是什么
bind是一个标准库函数,定义在functional头文件中。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成新的可调用对象来适应原对象的参数列表。

bind-绑定一切函数

std::bind可以绑定一切函数
• 将函数、成员函数和闭包转成function函数对象
• 将多元(n>1)函数转成一元函数或者(n-1)元函数。
1.改变参数个数,绑定全局函数:

int f(int, char, double);
auto ff = bind(f, _1, 'c', 1.2);     // 绑定f()函数调用的第二个和第三个参数,返回一个新的函数对象为ff,它只带有一个int类型的参数
int x = ff(7);                    //  f(7, 'c', 1.2);

2.改变参数的顺序

int f(int, char, double);
auto frev = bind(f, _3, _2, _1);        // 翻转参数顺序
int x = frev(1.2, 'c', 7);              // f(7, 'c', 1.2);

有以下类:

class student{
private:
	string name;
	int age;
public:
	static void showpersonms(string name,int age)
	{
		cout << "my name is " << name << ",and I am " << age << " years old!\n";
	}
	void introduce(string name,string addr)
	{
		cout << "my name is " << name<< " and my addr is " << addr << endl;

	}
};

3.绑定静态成员函数

auto pfx = bind(student::showpersonms, std::placeholders::_1, std::placeholders::_2);
pfx("jack",27);

结果:
在这里插入图片描述
4.绑定普通成员函数

student s;
auto myfun = std::bind(&student::introduce, s, std::placeholders::_1, std::placeholders::_2);

结果:
在这里插入图片描述

设置类成员函数为回调函数
回调函数往往通过函数指针来实现,而类的成员函数,多了一个隐含的参数this,所以直接赋值给函数指针会引起编译报错。通过bind可以解决此问题

class MyClass
{
public:
	MyClass() :n(0) {};
	~MyClass()=default;
	void add(int i) { n += i; cout << n; }

private:
	int n;
};

MyClass a;
auto f = bind(&MyClass::add, &a, _1);
f(1);//输出1
f(2);//输出 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发如雪-ty

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

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

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

打赏作者

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

抵扣说明:

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

余额充值