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

Posted

技术标签:

【中文标题】将 C++ 成员函数分配给 C 函数指针【英文标题】:Assign C++ member function to C function pointer 【发布时间】:2017-07-17 10:38:39 【问题描述】:

我有一个 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”中的“”。

是否有一种(简单/增强)方法可以将成员函数分配给结构的指针?

【问题讨论】:

这根本不可能。使用例如std::function(或Boost function)改为。或者使用非成员函数,或者static成员函数。 顺便说一下,“C”库结构不是 C 库的一部分。 C 没有像你展示的 A 那样的成员函数。 我尝试在 C 代码中使用 boost::function。但随后 C 编译器抱怨找不到“”包含。 这就是每个好的 C 回调系统都应该包含 void * 上下文参数的原因。 【参考方案1】:

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

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

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

纯 C++ 项目可以使用 std::function 和 std::bind 来实现您的要求,但 C++ 项目使用的 C 库无法使用这些类型。

【讨论】:

以上是关于将 C++ 成员函数分配给 C 函数指针的主要内容,如果未能解决你的问题,请参考以下文章

将泛型函数分配给函数指针结构成员

Fortran:指向抽象成员函数的函数指针

如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调

C++函数指针与成员函数指针

C ++:将成员函数作为普通函数指针传递的闭包

C++成员函数指针指向全局函数指针