std :: bind,this和QtConcurrent

时间:2012-11-30 14:39:56

标签: c++ c++11 qtconcurrent stdbind

我尝试使用std::bindthis绑定到QtConcurrent::blockingMapped

中使用的方法

部首:

class TuringMachine
{
private:
    TRTable table;
    std::set<ConfigNode*> currentConfigs;

    //function object
    std::function<std::set<ConfigNode*>( const TuringMachine*, ConfigNode*)> step_f;
    //method it will hold
    std::set<ConfigNode *> step(TuringMachine* this_m ,ConfigNode *parent);

    std::set<ConfigNode*>& makeStep();

}

来源:

    TuringMachine::TuringMachine(/**/)  
{

    step_f = std::bind(&TuringMachine::step, this, std::placeholders::_1);
}

std::set<ConfigNode*> &TuringMachine::makeStep(){

    auto configSet = QtConcurrent::blockingMapped<QLinkedList<std::set<ConfigNode*>>>(currentConfigs, step_f);//concurrent execution!

   /**/ 
   return currentConfigs;
}
std::set<ConfigNode*> TuringMachine::step(TuringMachine *this_m, ConfigNode * parent){     //the actual step
  /**/
}

所以我在这里做的是与blockingMapped ConfigNode currentConfigs上的std::bind同步运行。我正在使用thisstep绑定到blockingMapped,因此它只需要一个参数,如error: no match for call to '(std::_Bind<std::_Mem_fn<std::set<ConfigNode*> (TuringMachine::*)(TuringMachine*, ConfigNode*)>(TuringMachine*, std::_Placeholder<1>)>) (const TuringMachine*, ConfigNode*)' .../Qt/474/gcc/include/QtCore/qtconcurrentmapkernel.h:121: error: no match for call to '(std::function<std::set<ConfigNode*>(const TuringMachine*, ConfigNode*)>) (ConfigNode* const&)' .../Qt/474/gcc/include/QtCore/qtconcurrentmapkernel.h:136: error: no match for call to '(std::function<std::set<ConfigNode*>(const TuringMachine*, ConfigNode*)>) (ConfigNode* const&)' 的文档中所示。

我得到了

note: 2 arguments expected, 1 provided

//function object std::function<std::set<ConfigNode*>( ConfigNode*)> step_f; //method it will hold std::set<ConfigNode *> step(ConfigNode *parent);

我哪里出错了?

修改

已更正,正在使用的版本(以供将来“参考”):

部首:

    TuringMachine::TuringMachine(/**/)  
{
    step_f = std::bind(&TuringMachine::step, this, std::placeholders::_1);
}

来源:

{{1}}

1 个答案:

答案 0 :(得分:3)

如果要绑定成员函数,则必须传递this指针,在您的情况下,这意味着您必须传递2 this - 指针:

正常调用成员函数:

struct bar {
  int a;
  void foo() {
    std::cout << a << std::endl;
  }

  void call_yourself() {
     auto f = std::bind(&bar::foo, this);
     f();
  }
};

你的案子:

    step_f = std::bind(&TuringMachine::step, this, this,std::placeholders::_1);

如果不理解您的代码,我可能会重新编写代码,以避免使用双this指针。