я использую Касабланка C ++ Rest SDK для http соединений. Вот основной кусок кода, который делает http-запрос.
Скопировано из Касабланка документация:
// Creates an HTTP request and prints the length of the response stream.
pplx::task<void> HTTPStreamingAsync()
{
http_client client(L"http://www.google.com");
// Make the request and asynchronously process the response.
return client.request(methods::GET).then([](http_response response)
{
// Response received, do whatever here.
});
}
Это сделает асинхронный запрос и обратный вызов по завершении. Мне нужно создать свой собственный класс, который использует эти коды, и я хочу обернуть его в свой собственный обратный вызов.
Для простоты предположим, что я хочу создать класс с методом, который печатает HTML-код google.com.
Так что я ожидал что-то вроде этого:
MyClass myObject;
myObject.getGoogleHTML([](std::string htmlString)
{
std::cout << htmlString;
});
Я искал и читал похожие статьи, такие как:
Но я все еще немного сбит с толку, когда привыкаю к completion block
в Objective-C
, Как я могу создать такой класс, который оборачивает обратный вызов?
Возьмите лямбду как общий тип. В качестве бонуса он будет работать с любым другим вызываемым объектом.
template<typename F>
pplx::task<void> MyClass::getGoogleHTML(F f) {
http_client client(L"http://www.google.com");
return client.request(methods::GET).then(f);
}
Вы также можете отлично переслать f
с помощью F &&f
а также .then(std::forward<F>(f))
если хочешь. Если вы действительно хотите извлечь что-то, чтобы передать переданную лямбду, передайте лямбду then
что захватывает f
и вызывает его с этими извлеченными данными.