使用对象方法作为函数回调
Using an object method as a function callback
我使用的是一个C库,它具有回调函数,如:
int DownloadStream(LPCTSTR host,DWORD channelNumber,NewImage pNewImage);
typedef int (*NewImage)(BYTE *pData, int nLen,void *returnHandle);
在C中,我可以这样打电话:
int CallDownloadStream(LPCTSTR host,DWORD channelNumber)
{
int hr = DownloadStream(host,channelNumber,OnNewImage);
return hr;
}
int OnNewImage(BYTE *pData, int nLen,void *returnHandle)
{
// able to get data
}
我想要的是作为C++类的成员调用这些函数,例如:
class MyClass
{
public:
int CallDownloadStream(LPCTSTR host,DWORD channelNumber)
{
int hr = DownloadStream(host,channelNumber,OnNewImag);
return hr;
}
int OnNewImage(BYTE *pData, int nLen,void *returnHandle)
{
// able to get data
}
}
我无法编译它。可以用那种方式使用那些回调函数吗?如果是这样,该怎么做?
附言:我无法控制原来的C风格回调函数。
无法完成。如果C函数不提供用户提供的参数指针,而在C中是惯用的,则不能执行此操作。
编辑:这不是严格意义上的。可以使用静态变量,可以使用线程本地存储,也可以JIT函数。然而,这些并不是一般情况下的解决方案。
您要做的是传递一个函数指针,以便C函数可以调用它。换句话说,您传递的函数指针必须可以从C调用。这意味着它需要是extern "C"
,而不能是典型的成员函数。它可以是static
成员函数,也可以是独立函数,但不能是类成员函数。
这意味着回调函数不能影响类数据成员。它可以影响静态成员数据、全局数据或其他任何数据,但不能影响类成员数据。如果这是您想要的效果,那么您需要提供某种非类缓冲区,并自己转移数据。
这也意味着传递的函数不能是多态的。如果想要多态行为,则需要将要传递的所有回调函数定义为static
或在任何类之外,并在多态函数中调用库函数。
不能将非静态成员函数用作C回调函数。
因此,答案是使用静态成员函数。
您可能能够使用libsigc++-http://libsigc.sourceforge.net/(查看mem_fun的文档)。我不知道到底需要什么才能使它正常工作。或者,制作一个C回调函数,该函数只需使用指向对象的指针来调用适当的C++函数。(这可能是最简单的方法)
相关文章:
- 以特征类型作为参数的泛型函数回调
- C# DllImport 调用非托管C++函数回调
- 为什么模板参数推导失败,std::函数回调的可变参数模板参数?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 如何设置对类的私有函数的函数回调?
- 如何使用 c++11 函数回调声明多个模板参数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- Windows表单如何使用其他函数回调图表信息
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 将成员函数作为标准函数回调
- C++ 使用成员函数回调实现按钮
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 使用可变参数模板从 Lua 函数回调 (C api) 中提取参数
- 在C++中使用派生类的静态方法作为函数回调
- 将libuv与函数结构一起使用,而不是函数回调
- 如何将函数回调传递给类成员
- c++类成员函数回调
- C++函数回调:无法从成员函数转换为函数签名
- 如何编写一个通用函数回调测试类