【问题标题】:C++: Creating a function object with mem_fn and bind1stC++:使用 mem_fn 和 bind1st 创建函数对象
【发布时间】:2015-09-17 15:17:15
【问题描述】:

免责声明:此说明包含许多 Qt 特定功能。这不是回答问题的必要条件,我只是为了说明背景。

我需要在我的 QT 应用程序中进行一些繁重的计算。 为了做到这一点,我想使用 QtConcurrent::run(myFunction) 这是 Qt 的 async 版本并创建一个未来,它在某些时候将包含 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 的代码。

【问题讨论】:

    标签: c++ qt concurrency functional-programming mem-fun


    【解决方案1】:

    只需使用lambda expression.

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

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

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

    【讨论】:

    • 感谢有关数据竞争的警告。但这是故意的。结果很大,副本会浪费很多内存。所有访问都是同步的(至少我希望如此)
    • @lhk 然后不复制数据似乎是合理的。很高兴为您提供帮助!
    【解决方案2】:

    您正在尝试将 C++98 bind1st 与 C++11 mem_fn 混合使用,这是不可能的。

    bind1st 需要一个adaptable binary function,这意味着一个定义某些类型定义,一个接受恰好两个参数。您不能将它与需要两个以上的东西一起使用并且一次只绑定一个参数。

    在 C++11 中,由于decltype 和其他新特性,可以在没有这些类型定义的情况下包装函数对象,因此“自适应二进制函数”现在是一个无用的概念,bind1st 无用且已弃用。

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多