如何包装C ++ 11回调?

时间:2014-06-26 15:04:10

标签: c++ c++11 lambda callback casablanca

我正在使用Casablanca C++ Rest SDK进行http连接。这是一个发出http请求的基本代码。

Casablanca documentation复制:

// 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.
    });
}

这将执行异步请求并在完成后执行回调。我需要创建自己的使用这些代码的类,并且我想将它包装到我自己的回调中。

为简单起见,假设我想创建一个具有打印google.com的html代码的方法的类。

所以我期待这样的事情:

MyClass myObject;
myObject.getGoogleHTML([](std::string htmlString)
{
    std::cout << htmlString;
});

我搜索并阅读了相关文章,如:

  1. C++ class member callback simple examples
  2. C++11 styled callbacks?
  3. Friday Q&A 2011-06-03: Objective-C Blocks vs. C++0x Lambdas: Fight!
  4. 但是当我在completion block中使用Objective-C时,我仍然有点困惑。我如何构建这样一个包装回调的类?

1 个答案:

答案 0 :(得分:1)

将lambda作为一般类型。作为奖励,它可以与任何其他可调用对象一起使用。

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);
}

如果您愿意,也可以通过fF &&f完美转发.then(std::forward<F>(f))。如果您实际上想要提取一些内容以提供给传入的lambda,请将lambda传递给捕获then的{​​{1}}并使用提取的数据调用它。