std :: bind, this и QtConcurrent

Я пытаюсь использовать std::bind связывать this к методу, который используется в 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 связывать this в step так что требуется только один аргумент, как в документации 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);
}

3

Решение

Если вы хотите связать функцию-член, вам нужно будет передать this указатель, который в вашем случае будет означать, что вам придется пройти 2 this-pointers:

Обычный вызов функции-члена:

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 указатель.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]