Как обернуть обратный вызов C ++ 11?

я использую Касабланка 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;
});

Я искал и читал похожие статьи, такие как:

  1. Простые примеры обратного вызова членов класса C ++
  2. C ++ 11 в стиле обратных вызовов?
  3. Пятница Q&A 2011-06-03: Блоки Objective-C против C ++ 0x Lambdas: Бой!

Но я все еще немного сбит с толку, когда привыкаю к completion block в Objective-C, Как я могу создать такой класс, который оборачивает обратный вызов?

1

Решение

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

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 и вызывает его с этими извлеченными данными.

1

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