我有一个带有此签名的回调(我使用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
作为回调。
答案 0 :(得分:0)
您不能将非静态成员函数用作需要常规函数的回调参数,因为它们的签名不兼容:
只有执行回调的库允许您使用回调注册传递自定义参数时,才可能采用此常见解决方法。这通常使用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*
类,并执行非静态回调。
答案 1 :(得分:0)
你想要两个指针,一个指向一个对象,一个指向成员函数:
void (RTSPClient::*mfptr) = &RTSPClient::continueAfterDESCRIBE;
和一个对象:
RTSPClient* p = new RTSPClient();
然后调用它:
p->*mfptr(...);