C++ std::function 在不公开方法的情况下在库之间绑定回调 API

C++ std::function bind callback between libraries without exposing method API

在问这个问题之前,我查看了很多链接,并阅读了很多关于 std::function、std:bind 和 C++ 回调的文章。据我了解,这个概念主要是让事件处理程序在某个事件发生后通知侦听器。当我是这种编程风格的新手时,我很难找到适用于跨库边界的正确实现。

这是我需要实施的情况或设计:

我有一个库 A,它在 class 中有一个私有函数,它接受某些数据并进行一些处理。有一个库 B 提供库 A 中的函数所需的相同数据,但是库 B 公开一个 std::function 来接收该数据。其他库需要将其函数绑定到其回调以接收数据。因此,我需要在我的应用程序 class.

中将库 A 的 func 绑定到库 B 的 std::function
Inside libraryA {

Class A {

private:
    AA objAA;
}

Class AA {

private:
    void func(int x) {
        //this is the function I want to tie to calback in library libB without exposing the method api
        //How can I expose a public api to return the address of this function so that the app can bind it to libraryB's callback ?
    }
}

}

Inside libraryB {

Class B {
public:
    void registerCallback(std::function<void (int)> callmePls) {
        m_callback = callmePls;
    }
private:
    typedef std::function<void (int)> theCallback;
    theCallback m_callback;
}

}


Inside my Application which uses both libraryA & libraryB {
//How can I bind/assign “func” in libraryA to the callback in libraryB ?
}

我怎样才能将 libraryA 的 public api 暴露给 return 感兴趣函数的地址,以便应用程序可以将它绑定到 libraryB 的回调? 我如何 bind/assign libraryA 中的“func” 到 libraryB 中的回调?

主体在 .cpp 文件中实现(不在 header 中):

 class A {
 public:
   void listen(int x) {
     objAA.func(x);
   }

   std::function<void(int)> get_listener() {
     return [this](int x){ x.objAA.func(x); };
   }

   void listen_to( std::function< void( std::function< void(int) > ) > f ) {
     f( [this](int x){ x.objAA.func(x); } );
   }

在这里,你必须做一些体操才能让 registerCallback 进入 listen_to

确实,后面的比较抽象,但实际上并不能阻止你调用func