带有功能指针的C 回调
C++ callback with function pointers
我正在编写使用第三方库打开专有文件的C 应用程序。在我的应用程序中,用户可以做类似的事情:
int main(int argc, char* argv[]) {
CustomFileFormat f1;
f1.open( "c:/file1.xyz" );
f1.process();
CustomFileFormat f2;
f2.open( "c:/file2.xyz" );
f2.process();
Result r = f1.compare( f2 );
r.generateReport();
return 0;
}
我遇到的问题是Process()函数。此函数将命令发送到第三方库,该库揭示了这样定义的回调函数:
typedef void (*FileProgressCallback)( double dProgress, bool& shouldAbort );
将从第三方库中调用此回调函数,告诉我已经处理了多少文件(接收到的dprogress值将在0到1之间),以及我可以使用的应该用来导致处理停止的bool bool变量。
我遇到的问题是我不知道如何编码process()函数,以便在调用回调时,我知道返回的结果是例如F1还是实例F2。是否可以定义我的CustomFileFormat类的成员函数,以便在称呼它时,我知道正在使用哪个?
一种简单的方法是在.process()呼叫之前,要设置一个带有某些上下文的全局。如果将全球变成堆栈,您甚至可以执行递归处理(尽管如上所述,听起来并不是您需要的一部分)。
一个更复杂的答案是使用诸如Libffi封闭之类的东西(该库可从https://sourceware.org/libffi/或https:/https://github.com/libffi/libffi获得)。库的那部分实际上在运行时生成了(小)代码,可以将其他参数与从呼叫者接收的参数相关联。
相关文章:
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 具有指向方法回调的指针的通用回调模板类
- 回调到干净的指针(MCVE:自动从车辆中弹出叛徒士兵)
- 如何定义与将 Lambda 与捕获作为回调一起使用兼容的函数指针
- 如何使用C++函数指针作为指向 C 函数指针/回调的参数
- 是否可以使用包含{sub,super}类函数指针的回调表
- 如何使用C lambda将成员功能指针转换为普通功能指针,以用作回调
- FLTK 回调不接受我的函数指针
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 带有功能指针的C 回调
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?
- C++ 中的 C 库回调,不带指向"this"的指针
- 非成员功能指针作为API中的回调对成员函数
- 如何将C++lambda传递给需要函数指针和上下文的C回调
- 带有函数指针的c++模板回调
- 通过C++中的非静态函数设置对C函数指针的回调
- 如何正确删除指向回调函数的指针
- 是否应删除回调传递的void*指针