我必须在库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/

10-11 22:10
查看更多