C 体系结构:回到通用对象成员函数

c++ architecture: callback to generic object member function

本文关键字:对象 成员 函数 体系结构      更新时间:2023-10-16

这个问题基于:通过函数指针调用C 类方法

我想做的是将通用对象成员函数注册到架构中的模块较低的模块,可以调用事件回调。

我需要的是能够注册任何对象类型(通用),因此我不必为每种类型的对象具有注册功能。

1:

的示例
typedef void(Dog::*BarkFunction)(void);
Then to invoke the method, you use the ->* operator:
(pDog->*pBark)();

我的代码中的示例:

// application layer
class ObjectInHighterLayer
{
    ObjectInHighterLayer()
    {
        xyz::registerEventhandler(this, eventCallback); // ??? how to register here ???
    }
    void eventCallback(int x)
    {
    }
}
// middleware layer or hal layer
static clientcallback clientCb = NULL;
namespace xyz {
  typedef void (GENERIC_OBJECT_TYPE::*clientcallback)(int /*x*/); // ??? how to define callback type here ???
  void registerEventhandler(clientcallback cb);
  {
      clientCb = cb;
  }
  void task()
  {
    // ... if event happend
    callClients();
  }
  void callClients()
  {
    if(clientCb != NULL)
    {
        clientCb(3);
    }
  }
}

我知道有两种模式...

虚拟

所有回调函数共享类层次结构,因此可以使用单个虚拟函数派遣到正确的类型。

class CallbackBase {
     public:
          virtual void anEvent(int myEvent) = 0;
};

这可以直接由类注册。

class ObjectInHighterLayer
{
    ObjectInHighterLayer()
    {
        xyz::registerEventhandler(this, eventCallback); // ??? how to register here ???
    }
    void anEvent(int myEvent)
    {
     // receive callback
    }
}

或间接(可能更好地使用std::function

class Test {
public:
    void callable(int ) {
    }
};
typedef void (Test::*Callable)(int);

然后可以由代理对象调用,将回调的层次结构与所谓的。

class MyFunction {
public:
    Callable m_f;
    Test * m_Test;
    MyFunction( Test * pTest, Callable fn) : m_Test(pTest), m_f( fn )
    {
    }
    void anEvent( int x ) {
        (m_Test->*m_f)(x);
    }
};

允许为不同的回调注册不同的测试功能。

静态回调

Change the callback mechanism to take an opaque type.  This is easier to code, although sacrifices type-safety.
 class Callbackable {
     static void callback1( void * pThis, int param )
     {
         Callbackable *_this = static_cast<Callbackable*>( pThis );
         _this->callFunction( param );
     }
 }

callback1是因为它是静态的,在不同类(在任何层次结构之外)中具有相似函数的函数类型。用不正确的pthis称呼它的想法是类型的安全性弱点。