您的位置:首页 > 其它

std::function与std::bind 函数指针

2015-06-10 15:22 441 查看


std::function与std::bind 函数指针

分类: cpp2013-01-22
20:37 26330人阅读 评论(5) 收藏 举报

function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。

std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。

[cpp] view
plaincopy

#include <iostream>

#include <functional>

using namespace std;

typedef std::function<void ()> fp;

void g_fun()

{

cout<<"g_fun()"<<endl;

}

class A

{

public:

static void A_fun_static()

{

cout<<"A_fun_static()"<<endl;

}

void A_fun()

{

cout<<"A_fun()"<<endl;

}

void A_fun_int(int i)

{

cout<<"A_fun_int() "<<i<<endl;

}

//非静态类成员,因为含有this指针,所以需要使用bind

void init()

{

fp fp1=std::bind(&A::A_fun,this);

fp1();

}

void init2()

{

typedef std::function<void (int)> fpi;

//对于参数要使用占位符 std::placeholders::_1

fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);

f(5);

}

};

int main()

{

//绑定到全局函数

fp f2=fp(&g_fun);

f2();

//绑定到类静态成员函数

fp f1=fp(&A::A_fun_static);

f1();

A().init();

A().init2();

return 0;

}

同时,std::bind绑定到虚函数时会表现出多态行为。

[cpp] view
plaincopy

#include <iostream>

#include <functional>

using namespace std;

typedef std::function<void ()> fp;

class A

{

public:

virtual void f()

{

cout<<"A::f()"<<endl;

}

void init()

{

//std::bind可以表现出多态行为

fp f=std::bind(&A::f,this);

f();

}

};

class B:public A

{

public:

virtual void f()

{

cout<<"B::f()"<<endl;

}

};

int main()

{

A* pa=new B;

pa->init();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: