c语言中bind函数,std::function和std::bind的使用(总结)

在c++中,使用std::function和std::bind来代替函数指针。

一、贴上类和函数

#include

#include

using namespace std;

class MyClass

{

public:

void myfunc()

{

cout << "myfunc" << endl;

}

static void staticFunc()

{

cout << "staticFunc" << endl;

}

};

void func()

{

cout << "func" << endl;

}

void argsFunc(int i,char c,float f)

{

printf("i=%d,c=%c,f=%f \n",i,c,f);

}

二、使用函数指针

//定义函数指针,并且指向了func函数的地址

void(*ptr)();

ptr = &func;

ptr();

在面向过程的c语言中,是这样使用函数指针的,c++中也是可以这样写。但是,由于c++是面向对象,所以出现了对象的方式来代替函数指针。

三、由于c++面向对象,所以使用std::function来代替。

std::function f = func;

f();

此处,通过使用std:function这样的模板来代替函数指针。

四、std::function绑定类的静态成员

std::function staticF = MyClass::staticFunc;

staticF();

std::function能够绑定类的静态成员,和全局函数。但是,它不能绑定类的非静态成员,否则不能通过编译。

五、std::function不能绑定类的非静态成员函数

std::function func = MyClass::myfunc;//这种写法会报错

func();

那么,要绑定类的非静态成员函数,需要使用std::bind。

六、使用std::bind()来绑定类的非静态成员函数

MyClass myCls;

std::function func = std::bind(&MyClass::myfunc, myCls);

func();

std::function调用类的非静态成员函数,需要提供一个类的对象,这里创建了一个MyClass 的栈对象myCls,提供给std::bind。

七、std::bind 可以改变参数的顺序

std::function func = std::bind(argsFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);

func('a', 0.01f, 10);

std::bind可以改变参数的顺序,看起来容易造成混乱。void(char, float, int)  中的char,float,int和参数std::placeholders::_2, std::placeholders::_3, std::placeholders::_1按顺序对应,但在实际函数argsFunc(int  i,char c,float f)中实际参数按从左到右,对应std::placeholders::_1,std::placeholders::_2,std::placeholders::_2。此处容易造成混淆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值