【问题标题】:C++ callback with function pointers带有函数指针的 C++ 回调
【发布时间】:2017-11-26 15:20:16
【问题描述】:

我正在编写一个使用第 3 方库打开专有文件的 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 );

将从第 3 方库调用此回调函数,告诉我已处理了多少文件(接收到的 dProgress 值将在 0 和 1 之间)以及我可以用来导致处理停止的 shouldAbort 布尔变量.

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

【问题讨论】:

  • 您必须以某种方式记录正在播放的对象实例,可能通过使用当前实例创建静态或全局变量。

标签: c++ function callback function-pointers


【解决方案1】:

一个简单的方法是在 .process() 调用之前设置一个带有上下文的全局变量。如果您将全局设为堆栈,您甚至可以执行递归处理(尽管如上所述,这听起来不像您需要的一部分)。

更复杂的答案是使用类似 libffi 的闭包(该库可从 https://sourceware.org/libffi/https://github.com/libffi/libffi 获得)。这部分库实际上会在运行时生成(少量)代码,这些代码可以将附加参数与从调用者接收到的参数相关联。

【讨论】:

  • 我正在考虑使用全局,但这意味着我无法在 2 个不同的线程中为 2 个不同的实例运行 process()。
  • 如果您需要同时在多个线程上执行此操作,可以将全局设置为线程本地。
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 2022-11-10
  • 2020-06-28
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多