您的位置:首页 > 其它

boost:bind原理

2011-04-02 00:11 344 查看
废话不多说,贴上代码,简单拙劣模仿。

一、指向函数的指针

语法:数据类型 (*函数指针名)(形参表);

void run(){
  cout<<"run"<<endl;
}
void(*p)() = run;
p();
[/code]

二、获取并调用类的成员方法

class Foo
{
public:
void run(){
cout<<"Foo run;"<<endl;
}
};
void (Foo::*p)() = &Foo::run;
Foo foo;
(foo.*p)();
[/code]

三、模板化

template <class T>void call(void(T::*p)(),T t)
{
(t.*p)();
}
Foo foo;
call(&Foo::run,foo);
[/code]

四、泛化

参考Boost::Any的实现,把类的成员方法和对象保存起来。

class PlaceHolder{
public:
virtual void run() = 0;
};

template<typename T>
class Holder:public PlaceHolder
{
public:
Holder(void(T::*method)(),T obj):method(method),obj(obj){}
virtual void run(){
(obj.*method)();
}
private:
T obj;
void(T::*method)();
};

class Function
{
public:
template<typename T> Function(void(T::*method)(),T obj)
{
this->method = new Holder<T>(method,obj);
}
void operator ()(){
method->run();
}
PlaceHolder *method;
};
Function f(&Foo::run,foo);
f();
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: