将C ++成员函数分配给C函数指针

时间:2017-07-17 10:38:40

标签: c++ c pointers boost

我有一个带有这样结构的C库:

   struct A {
      void process(){
        doProcess();
      };
      void (*doProcess)(void);
   }

现在,我有一个像

这样的课程
class B
{
  public: 
    B(): a(){
      a.doProcess = print();
    }
  void print(){
    // do anything
  }
  private:
    A a;
}

这不起作用,因为print是一个成员函数,必须在B的对象上调用。 因此我尝试使用boost :: bind函数:

a.doProcess = boost::bind(&A::print, this)

这也不起作用。

我还试图修改C库并用boost :: function定义替换函数指针定义。但后来编译器抱怨没有找到“boost / function.h”中包含的“”。

是否有(easy / boost)方法将成员函数赋值给struct的指针?

1 个答案:

答案 0 :(得分:2)

你根本做不到这一点。成员函数有一个隐含的this参数,它是一个指向调用函数的对象的指针。不将B *作为参数的函数将永远不会在特定的B实例上运行,并且不将此点作为其第一个参数的函数永远不会具有与类方法相同的签名。有关此问题的更多详细信息以及变通方法的示例,请阅读:

https://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr

请注意答案底部的注释,说明如何以这种方式使用静态成员函数。

纯C ++项目可以使用std :: function& std :: bind来实现你所要求的,但是C ++项目使用的C库不能用于这些类型。