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
。
在问这个问题之前,我查看了很多链接,并阅读了很多关于 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
。