带有函数指针的C ++回调

时间:2017-11-26 15:20:16

标签: c++ function callback 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之间)和我可以用来使处理停止的shouldAbort bool变量。

我遇到的问题是我不知道如何编写process()函数,以便在调用回调时,我知道返回的结果是例如f1还是实例f2 。是否可以定义我的CustomFileFormat类的成员函数,以便在调用它时,我知道正在使用哪个(这个)?

1 个答案:

答案 0 :(得分:0)

一个简单的方法是在.process()调用之前设置一个带有某些上下文的全局。如果你使全局成为一个堆栈,你甚至可以执行递归处理(尽管如所描述的那样听起来并不像你需要的那样)。

更复杂的答案是使用像libffi的闭包这样的东西(该库可以从https://sourceware.org/libffi/https://github.com/libffi/libffi获得)。该部分库实际上在运行时生成(小)代码,可以将其他参数与从调用者接收的参数相关联。