我必须在库API中设置一个函数指针,以便它在需要执行特定操作时调用该函数。
int (*send_processor)(char*,int);
int setSendFunctor(int (*process_func)(char*,int))
{
send_processor = process_func;
}
在我的主要资料中,我将此函数定义为类的成员函数,
int thisclass::thisfunction(char* buf,int a){//code}
此功能取决于此类中的其他功能。因此,我无法将其与类(class)分开。
我无法在setSendFunctor中设置指向成员函数的指针,因为在API内部,它不是将其分配给成员函数的指针,而是分配给常规函数的指针send_processor。
由于此类不是派生类,因此无法使用虚函数。
处理此问题的最佳方法是什么?
最佳答案
我通常的处理此问题的方法是在类中创建一个静态函数,该函数将显式的this
指针作为参数,然后仅调用成员函数。有时,静态函数需要紧密遵循C库期望进行回调的类型签名,在这种情况下,我将在这种情况下常见的void *
强制转换为我真正想要的this
指针,然后调用成员函数。
如果该API没有提供给它void *
并将其返回给您的回调的功能,则该API已损坏,需要修复。如果您无法解决问题,则有一些选项涉及全局(或它们的小表亲static
)变量。但是它们很丑。
我确实曾经创建了一个相当朴实的模板系统来创建这些类型的变量,并为它们绑定(bind)了一个静态函数,然后您可以将其传递给具有此类API的对象。但是我必须去追逐它,我并不真正相信它比普通的旧全局性网站有任何好处。
一个不使用模板的基于该想法的解决方案如下所示:
class InstanceBinder1 {
public:
static initialize(thisClass *instance, int (thisClass::*processor)(char *buf, int a)) {
instance_ = instance;
processor_ = processor;
}
static int processor(char *instance, int a) {
instance_->*processor_(buf, a);
}
private:
static thisClass *instance_;
static int (thisClass::*processor_)(char *buf, int a);
};
然后,您可以将
&InstanceBinder1::processor
传递给C库。您需要为需要C库调用的每个单独的
thisClass
实例创建一个这种类型的新类。这意味着这些实例的数量将在编译时确定,并且没有办法解决。关于c++ - 关于使用指针加入成员函数的困境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4234847/