boost :: packaged_task с функцией-членом - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать задачу с помощью упакованной задачи.
Я использую сопрограмму-член, в которой есть аргументы, в том числе члены типа string и общего указателя на класс.
Затем я помещу будущее задачи в контейнер, который будет использоваться с wait_for_any.
и затем я отправляю задачу в asio ioservice.
это прототип сопрограммы:

std::string Execute(boost::asio::yield_context, std::string,  std::map<std::string, boost::shared_ptr<HTTPResponse>>&);

и вот как я пишу упакованную задачу, обратите внимание, что выполнение сопрограммы является членом другой класс, экземпляр которого сохраняется с помощью shared_pointer в карте, и здесь я разыменую этот общий указатель карты, чтобы получить указатель на экземпляр «вместо указателя» this «требуется для функции-члена»:

boost::packaged_task<std::string(boost::asio::yield_context, std::string, std::map<std::string, boost::shared_ptr<HTTPResponse>>&)> task(boost::bind(&HTTPRequest::Execute, mClientRequestsVariables[m_HttpClient_request_name].get(),boost::placeholders::_1, m_HttpClient_request_name, Get_mHTTPClient_Responses_Map()));

, и это как я пишу остальное:

boost::future<std::string> fut = (task.get_future());
        mPendingData.push_back(std::move(fut)); // C++11 possible: (std::move(fut) when fut is a unique_future);
        mIos.post(std::move(task)); 

это дает мне следующую ошибку:

Error   C2280   'boost::packaged_task<std::string (boost::asio::yield_context,std::string,std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &)>::packaged_task(const boost::packaged_task<std::string (boost::asio::yield_context,std::string,std::map<_Kty,_Ty,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &)> &)': attempting to reference a deleted function    


Error   C2338   CompletionHandler type requirements not met 

Error   C2064   term does not evaluate to a function taking 0 arguments 

что я могу сделать ??

обновление:
Я прочитал некоторые ответы о packaged_task и попытался изменить код на:

typedef boost::packaged_task<std::string(boost::asio::yield_context, std::string, boost::shared_ptr<std::map<std::string, boost::shared_ptr<HTTPResponse>>>)>  task_t;
        //typedef boost::packaged_task<std::string()>  task_t;
boost::shared_ptr<task_t> task = boost::make_shared<task_t>(boost::bind(&HTTPRequest::Execute, mClientRequestsVariables[m_HttpClient_request_name].get(), boost::placeholders::_1, m_HttpClient_request_name, Get_mHTTPClient_Responses_Map_shared_pointer()));

boost::future<std::string> fut = (task->get_future());
mPendingData.push_back(std::move(fut)); // C++11 possible: (std::move(fut) when fut is a unique_future);

и закомментировал эту строку:

        //????????mIos.post(boost::bind(&task_t::operator(), task));

и код скомпилировано.
но когда я раскомментирую эту строку:

mIos.post(boost::bind(&task_t::operator(), task));

эта ошибка происходит:

Error   C2440   'return': cannot convert from 'void (__cdecl &)(boost::asio::yield_context,std::string,boost::shared_ptr<std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>>)' to 'void (&)(boost::asio::yield_context,std::string,boost::shared_ptr<std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>>)'    

в чем проблема с постом io_service ???

...