C++ c++;体系结构:对通用对象成员函数的回调

C++ c++;体系结构:对通用对象成员函数的回调,c++,C++,这个问题基于: 我想做的是将一个通用对象成员函数注册到架构中较低的模块,该模块可以调用事件回调 我需要的是能够注册任何对象类型(泛型),所以我不必为每种类型的对象注册函数 示例来自: 我的代码中的示例: // application layer class ObjectInHighterLayer { ObjectInHighterLayer() { xyz::registerEventhandler(this, eventCallback); // ??? ho

这个问题基于:

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

我需要的是能够注册任何对象类型(泛型),所以我不必为每种类型的对象注册函数

示例来自:

我的代码中的示例:

// 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 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);
    }
};
允许为不同的回调注册不同的测试函数

静态回调
更改回调机制以采用不透明类型。尽管牺牲了类型安全性,但这更容易编码。
类可回调{
静态void回调1(void*pThis,int参数)
{
可回调*_this=静态强制转换(pThis);
_此->调用函数(参数);
}
}

callback1因为是静态的,所以它与不同类(任何层次结构之外)中的类似函数共享一个函数类型。用不正确的p调用它的想法这是类型安全弱点。

我知道有两种模式

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

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 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);
    }
};
允许为不同的回调注册不同的测试函数

静态回调
更改回调机制以采用不透明类型。尽管牺牲了类型安全性,但这更容易编码。
类可回调{
静态void回调1(void*pThis,int参数)
{
可回调*_this=静态强制转换(pThis);
_此->调用函数(参数);
}
}

callback1因为是静态的,所以它与不同类(任何层次结构之外)中的类似函数共享一个函数类型。使用不正确的p调用它的想法这是类型安全性的弱点。

然后使用基类和虚拟多态性。看看std::function。@user0042是一个嵌入式系统(低foodprint),代码大小为100k,内存为20k,频率为48MHz。虚拟多态性不可用。谢谢,谢谢。我会调查一下。如果你的要求对于虚拟函数来说太苛刻,恐怕std::function会更糟糕。但是一定要做这个实验,而不是相信我的话。那么就使用基类和虚拟多态性。看看std::function。@user0042它是一个嵌入式系统(低foodprint),代码大小为100k,内存为20k,频率为48MHz。虚拟多态性不可用。谢谢,谢谢。我会调查一下。如果你的要求对于虚拟函数来说太苛刻,恐怕std::function会更糟糕。但是一定要做这个实验,而不是相信我的话。