如何在C++中实现通用回调?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

原谅我对提出这个基本问题的无知,但我已经习惯于使用Python,因为这种事情是微不足道的,我已经完全忘记了我会如何在C ++中尝试这种方式。

我希望能够将回调传递给在后台执行缓慢进程的函数,并在进程完成后稍后调用它。这个回调可以是一个自由函数,一个静态函数或者一个成员函数。我也希望能够在上下文中注入一些任意的参数。(即以某种方式实现一个非常穷人的协同程序)。最重要的是,此函数将始终采用std :: string,即进程的输出。我不介意这个参数在最终回调参数列表中的位置是否固定。

我感觉到答案会涉及到boost :: bind和boost :: function,但是我无法确定为了创建任意可调参数而需要的精确调用(同时将它们压缩为只接受一个字符串),将它们存储在后台进程中,并使用字符串参数正确调用可调用对象。

提问于
用户回答回答于

回调应该存储为boost::function<void, std::string>。然后,可以boost::bind通过绑定其他参数,将任何其他函数签名“转换”为这样的对象。

我没有试图编译这个,但它应该显示一般的想法

void DoLongOperation(boost::function<void, const std::string&> callback)
{
  std::string result = DoSomeLengthyStuff();
  callback(result);
}


void CompleteRoutine1(const std::string&);
void CompleteRoutine2(int param, const std::string&);

// Calling examples
DoLongOperation(&CompleteRoutine1); // Matches directly
DoLongOperation(boost::bind(&CompleteRoutine2, 7, _1)); // int parameter is bound to constant.

// This one is thanks to David Rodríguez comment below, but reformatted here:
struct S 
{ 
  void f( std::string const & );
};

int main() 
{ 
  S s;
  DoLongOperation( boost::bind( &S::f, &s, _1 ) ); 
}
用户回答回答于

扫码关注云+社区