如何使用类实例成员函数指针填充函数指针成员

How to fill a function pointer member with class instance member function pointer?

本文关键字:指针 成员 函数 填充 实例 何使用      更新时间:2023-10-16

有一个C API,我需要创建一个C++对象来扩展它,如下所示:

struct OldCInterface {
   void (*doStuff)();
};
struct NewCXXBaseClass : protected OldCInterface {
   virtual void doStuff(); 
   virtual ~NewCXXBaseClass();
};

如果可能的话,如何将指向 CXX doStuff 的实例指针放入构造函数中的 C 接口中,如果我们有 Base 子级,它指向重载?

void (*doStuff)()如果函数指针,而&NewCXXBaseClass::doStuff的类型为 void (NewCXXBaseClass::*)(),即指向成员函数的指针。它们不兼容。通常,它们甚至不是相同的大小(sizeof(void (*)()) != sizeof(void (NewCXXBaseClass::*)()))。这么说,以下是正确的

struct OldCInterface {
   void (NewCXXBaseClass::*doStuff)();
};

但是由于您的初衷是使用一些旧的 C 代码。这可能行不通。最好的办法是创建一个静态成员函数,该函数调用某个对象的虚拟成员函数。一例证:

struct Proxy {
  static NewCXXBaseClass* s_p_;
  static void DoStuff() {
    s_p_->DoStuff();
  }
};

&Proxy::DoStuff 的类型为 void(*)(),可用于需要函数指针的位置。然后,您可以执行以下操作:

OldCInterface c_interface = {&Proxy::DoStuff};