简析function/bind如何实现类成员函数指针绑定调用

在一次项目开发中,需要将类内的一些非static成员方法作为线程函数启动,
大家都知道了,线程函数是有要求的,包括返回值、参数类型和个数,而且要求是全局函数或类内的static函数。

当然,使用做多的是,在外面封装一下函数,然后把类实体,如this作为参数传递进去,然后在函数内通过this调用成员方法。
但这样做比较别扭,额外写不少不少代码,而boost的function和bind恰恰解决了这个问题。

可能不少人有疑惑,类的非static成员函数为啥就比较特别?
和全局函数和类的static函数有什么不一样?

关于这个问题,如果看过《Inside the C++ Object Model》,应该是很清楚的了。
类的非staitc成员函数是依赖对象实体的,如this,因为成员函数可能使用到对象的成员变量,而成员变量是依赖对象的。

书上也说的很清楚了,在编译器实现上,类的非static成员函数的地址,不是一直真正的地址,需要依赖对象进行二次获取的。

所以,function和bind能做的,你也可以自己实现。

class Example{
       long value;
       int time;
    public:
       long get_value(){return value;}
};

int main()
{
       long (Example::*fp)() = &Example::get_value;
       Example e;
      
       //间接调用 Example::get_value()
       long v = (e.*fp)();
   
       return 0;
}

上面的例子是从网上看到的,虽然简单,但还是能看出很多东西来。
fp是依赖某个类某个方法的一个函数指针,调用时依赖于这个类的具体对象实例。
.*和->*是很少使用的操作符,在这里给我们看到了。

看到这里,大家很熟悉了吧?
这和我们通过一个对象实例调用成员函数没有任何区别,对编译器看起来是一样的。

编译器对非static成员函数,处理上是把对象实例作为函数第一参数传递的,
于是函数内所有关于对象实例的成员变量操作,均可以通过第一参数进行获取。

这些细节,都是编译器隐藏的,大家有兴趣可以看看《Inside the C++ Object Model》。

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值