повысить привязку с функцией-членом в вызове asio spawn

в следующем коде я создаю карту,
затем добавляю к ней несколько экземпляров класса httprequest,
затем я вызываю boost asio spawn, используя функцию-член класса httprequest,
я спрашивал об этом раньше и сказал, что это дубликат,
поэтому я прочитал сообщение и немного покопался, и нашел следующее:
я должен использовать boost::bind для преобразования функции-члена и ее аргументов в объект с одной функцией.
и внутри boost bind у меня есть чтобы добавить адрес экземпляра, на котором работает метод, и адрес метода "не получить, если адрес метода из определения класса или из используемого экземпляра,
затем добавить аргументы. Моя карта имеет httprequests, представленные общими указателями.
когда я пишу это и компилирую, это дает мне много ошибок, связанных с привязкой.
утверждается, что проблема находится в файле привязки, который представляет мой код, но не говорит, в какой части возникла проблема.

вот код:

std::map<std::string, boost::shared_ptr<HTTPRequest>> requests_variables;
std::map<std::string, boost::shared_ptr<HTTPResponse>> tasks;    

for (int hour = 0;hour < 24;hour++)
{
    std::stringstream ss_hour;
    ss_hour << std::setw(2) << std::setfill('0') << hour;
    std::string url_hour{ ss_hour.str() };
    std::stringstream().swap(ss_hour); // swap m with a default constructed stringstream
    URL = URL + url_hour +"h_ticks.bi5";

    std::string request_name = "request_" + std::to_string(hour);
    requests_variables[request_name] =  client.create_request(hour, URL);       
    boost::asio::spawn(client.get_service_reference(), boost::bind(&(*requests_variables[request_name]),&(*requests_variables[request_name]).execute, boost::placeholders::_1, tasks, request_name, requests_variables));

я много раз пытался манипулировать им, чтобы он скомпилировался, но тщетно.
что-то не так с привязкой, но я не могу до нее добраться.
заранее спасибо..


person ahmed allam    schedule 22.04.2018    source источник


Ответы (1)


я не знаю почему, но это заставило его работать.

HTTPRequest* requst_z = requests_variables[request_name].get();

        boost::asio::spawn(client.get_service_reference(), boost::bind(&HTTPRequest::execute, requst_z, boost::placeholders::_1, tasks, request_name, requests_variables));
person ahmed allam    schedule 22.04.2018
comment
Думаю, пришло время прочитать книгу по C++. Вы должны заметить разницу между &(*x_ptr).execute и &X::execute. Итак, вы действительно знаете, почему это работает. &(*x_ptr).execute пытается найти элемент (функцию) по указателю .... Это не работает. (*x_ptr).execute(arg1, arg2) будет выполнять этот член напрямую (так же, как более обычный синтаксис x_ptr->execute(arg1, arg2)), но это не то, что вам нужно: вы хотите иметь возможность выполнять эту функцию позже, поэтому вы связать &X::execute с некоторыми аргументами и некоторыми заполнителями. - person sehe; 22.04.2018
comment
Вы можете привязать любой вызываемый объект. Что такое calleable, описано в документации для Boost Bind, а также здесь: en .cppreference.com/w/cpp/concept/Callable - person sehe; 22.04.2018
comment
Большое спасибо за ваше объяснение ... слово прямо прояснило ... еще раз спасибо - person ahmed allam; 22.04.2018