繁体   English   中英

C ++:使用mem_fn和bind1st创建一个函数对象

[英]C++: Creating a function object with mem_fn and bind1st

免责声明 :此描述包含许多Qt特定功能。 回答这个问题不是必须的,我只是将其包括在内以解释背景。

我需要在我的QT应用程序中进行一些繁重的计算。 为了做到这一点,我想使用QtConcurrent::run(myFunction)这是Qt的async版本,并创建一个future,在某些时候它将包含myFunction的结果。

问题在于该函数既是成员函数,又需要复杂的参数。

我知道您可以将函数和指针都传递给QtConcurrent :: run。 然后将在指针上调用该函数。 您甚至可以提供参数列表。 但是似乎此列表仅接受诸如intdoubleQString

实际问题:

我想转换以下代码行:

model->nextStep(simulatedResult->last().molecules, dt)

进入

myFunction()

这意味着我需要

  1. 将指针绑定到函数
  2. 将参数绑定到函数

到目前为止,这是我的代码:

auto memfun=std::mem_fn(&ConcreteModel::nextStep);
auto memfun_bound_to_model=std::bind1st(memfun,model);
auto memfun_bound_result=std::bind1st(memfun_bound_to_model,simulatedResult->last().molecules);
auto memfun_bound_dt=std::bind1st(memfun_bound_result,dt);

不幸的是,这不起作用。 有18个编译器错误,这是pastebin: http : //pastebin.com/2rBQgFNL

如果您能解释如何正确执行此操作,那就太好了。 一个答案不是必需的,但更好的是QtConcurrent :: run的代码。

只需使用lambda表达式。

auto myFunction = [&] { return model->nextStep(simulatedResult->last().molecules, dt); }

您也可以使用std::bind (请参阅@JonathanWakely的答案),但是lamda表达式更加通用和强大。

另外,请记住,从多个线程读取和写入同一内​​存将导致数据争用(除非使用同步,否则请勿将指向可变数据的指针/引用传递给QT线程)。

您正在尝试将C ++ 98 bind1st与C ++ 11 mem_fn混合使用。

bind1st需要一个适应性强的二元函数 ,这意味着一个定义了某些类型定义,和一个取恰好两个参数。 您不能将它与需要两个以上的东西一起使用,并且一次绑定一个参数。

在C ++ 11中,由于使用了decltype和其他新功能,可以包装没有那些typedef的函数对象,因此“可适应的二进制函数”现在是一个无用的概念,而bind1st则是无用和不推荐使用的。

解决方案是简单地使用C ++ 11功能而不是bind1st ,例如std::bind或lambda表达式。

auto myFunction = std::bind( &ConcreteModel::nextStep, model, simulatedResult->last().molecules, dt);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM