【问题标题】:Assign C++ member function to C function pointer将 C++ 成员函数分配给 C 函数指针
【发布时间】: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 * 上下文参数的原因。

标签: c++ c pointers boost


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多