boost::asio::spawn
코 루틴을 사용하여 프로젝트를 다시 작성하려고합니다 . 프로젝트의 일부는 변경할 수 없습니다. 예를 들어 스토리지 프로토콜 라이브러리도으로 작성 boost::asio
되지만 코 루틴은 없습니다.
문제는 yield_context
일반 콜백 ( boost::function
객체 또는 클래식 펑터) 으로 변환하는 방법 입니다.
다음은 스토리지 라이브러리 API에있는 것입니다.
void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);
예제에서 알 수 있듯이 asio yield 컨텍스트는 다음과 같이 사용할 수 있습니다.
my_socket.async_read_some(boost::asio::buffer(data), yield);
이 경우 boost::asio::yield_context
객체는 async_read_some 의 콜백 역할을합니다 . 에 대한 두 번째 인수로 yield 객체 를 전달 async_request_data
하여 동기식으로 사용할 수 있습니다.
어떻게 할 수 있습니까? asio_handler_invoke 기반의 접근 방식을 사용하여 프록시 개체를 통해 가능할 수 있다고 생각합니다 . 그러나 나는 이것을하는 방법을 보는 데 어려움을 겪고 있습니다.
이 기능에 대한 최고의 문서는 boost asio 작성자가 작성한 C ++ 표준 제안에서 찾을 수 있습니다.
N4045 – 비동기 작업을위한 라이브러리 기초, 개정판 2
섹션 9.1을 참조하십시오.
handler_type_t<CompletionToken, void(error_code, size_t)> #3
handler(std::forward<CompletionToken>(token));
3 : 완료 토큰은 처리기로 변환됩니다. 즉, 비동기 작업이 완료 될 때 호출되는 함수 개체입니다. 서명은 핸들러에 전달 될 인수를 지정합니다.
나는 귀하의 경우 추측 CompletionToken
템플릿 인수가 실제로있을 것입니다 boost::asio::yield_context
및 handler_type
콜백 객체로 변환이.
async_request_data
함수 를 호출하기 위해 업데이트 된 섹션 9.1의 코드는 다음과 같습니다 .
template <class CompletionToken>
auto async_foo(uint64_t item_id, CompletionToken&& token)
{
handler_type_t<CompletionToken, void(Request_result *)>
handler(std::forward<CompletionToken>(token));
async_result<decltype(handler)> result(handler);
async_request_data(item_id, handler);
return result.get();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다