对成员函数的回调
Callback to a member function
我有一个带有此签名的回调(我正在使用Live555):
typedef void(RTSPClient::responseHandler)(RTSPClient*, ...); //... = other parameters
然后在我的代码中,我按照库规则创建了 RTSPClient 的子类:
class MyRTSPClient: public RTSPClient {
...
//callback
void continueAfterDESCRIBE(RTSPClient *client, ...); //same signature of typedef
...
};
现在问题来了。
在我的代码中,我必须调用以下方法:
unsigned RTSPClient::sendDescribeCommand(responseHandler, ...); //response handler is the typedef
如果我创建一个对象:
MyRTSPClient *client = MyRTSPClient::createNew(...); //is library requirement such creation
如何将函数对象作为回调传递给sendDescribeCommand
?
当然,如果我将continueAfterDESCRIBE
声明为静态成员,我没有任何问题,但我想要一个对象,因为我有很多线程,如果我使用从它们调用的静态回调,就会引发许多同步问题。
所以我正在努力(作为C++的新手)如何找出正确的签名以传递obj->method
作为回调。
不能将非静态成员函数用作需要常规函数的回调参数,因为它们的签名不兼容:
- 非成员或静态成员函数仅采用其签名中的参数
- 非静态成员函数为调用它的对象采用额外的"隐藏"参数。
仅当执行回调的库允许您使用回调注册传递自定义参数时,才可以使用此问题的常见解决方法。这通常使用 void*
指针完成,您在注册回调时将其传递给库,然后库在回调函数时将其传回给您。
方法如下:
// This is the static function that you register for your callback
static void staticContinueAfterDESCRIBE(RTSPClient *client, ...) {
static_cast<MyRTSPClient*>(client)-> continueAfterDESCRIBE(client, ...);
}
现在该函数是静态的,您可以毫无问题地将其注册为回调。函数获取控件后,它会client
强制转换为MyRTSPClient*
类,并执行非静态回调。
您需要两个指针,一个指向对象,一个指向成员函数:
void (RTSPClient::*mfptr) = &RTSPClient::continueAfterDESCRIBE;
一个对象:
RTSPClient* p = new RTSPClient();
然后调用它:
p->*mfptr(...);
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类