【问题标题】:How to fill a function pointer member with class instance member function pointer?如何用类实例成员函数指针填充函数指针成员?
【发布时间】:2015-04-25 02:09:17
【问题描述】:
拥有一个 C API,我需要创建一个 C++ 对象,像这样扩展它:
struct OldCInterface {
void (*doStuff)();
};
struct NewCXXBaseClass : protected OldCInterface {
virtual void doStuff();
virtual ~NewCXXBaseClass();
};
如果可能的话,如果我们有 Base child,如何将指向 CXX doStuff 的实例指针放入构造函数中的 C 接口中,使其指向重载?
【问题讨论】:
标签:
c++
c
function
interface
function-pointers
【解决方案1】:
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};