将需要回调的函数调用转换为协程

淡紫色

我正在探索并尝试学习C ++协程(在C ++ 20中添加)。我正在使用的SDK具有异步API调用,这些调用均带有回调,这些回调在SDK管理的某些后台线程上调用。


namespace third_party {

bool api_call(const std::string& some_parameter, const std::function<void(std::error_code)>& callback);

} // namespace third_party

我想将此API调用包装成可以等待的东西:


namespace my_third_party_sdk_wrapper {

cppcoro::task<std::error_code> api_call(const std::string& some_parameter);
cppcoro::task<std::error_code> api_call(const std::string& some_parameter, cppcoro::cancellation_token token);

} // namespace my_third_party_sdk_wrapper 

我正在考虑使用cppcoro库,但这不是必需的,除非通过这种方法使包装器的实现变得简单得多。

问题是我不知道如何实现包装器。

姆佩特

雷蒙德·陈(Raymond Chen)有一篇非常好的文章,您可以在这里找到

就您而言,您可以执行以下操作。

namespace my_third_party_async_sdk_wrapper 
{

    auto api_call_async(const std::string& some_parameter)
    {
          struct awaiter : public std::experimental::suspend_always
          {
               awaiter(const std::string &parameter)
               :parameter_(parmeter) {}

               bool await_ready() { return false; }

               void await_suspend(std::experimental::coroutine_handle<> handle)
               { 
                   // use your third party lib call directly here.
                   api_call(parameter_, [handle]() 
                   { 
                       // call the handle to resume the coroutine
                       handle(); 
                   }
               }
               const std::string parameter_;

          };
          return awaiter(some_parameter);
    }

}

这应该做您想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误:需要回调函数

来自分类Dev

(为什么)jQuery .click()需要回调函数?

来自分类Dev

(为什么)jQuery .click()需要回调函数?

来自分类Dev

我们如何在需要协程的情况下调用正常函数?

来自分类Dev

如何使用两个回调将函数调用转换为Promise

来自分类Dev

如何将协程Flow <List <T >>转换为List <T>

来自分类Dev

使用协程使函数返回在回调中获得的值

来自分类Dev

电机错误:需要回调

来自分类Dev

从基于生成器的协程转换为本地协程

来自分类Dev

在Python中从协程调用协程

来自分类Dev

在Python中从协程调用协程

来自分类Dev

将字符向量转换为函数调用

来自分类Dev

如果从协程调用非暂停函数会怎样?

来自分类Dev

如何使用Kotlin协程调用阻塞函数?

来自分类Dev

node + mongo:更新记录需要回调

来自分类Dev

节点Route.get()需要回调函数,但得到一个[对象未定义]

来自分类Dev

快速路由:.get()需要回调函数,但有一个[object Object]

来自分类Dev

Route.get()需要回调函数,但得到“对象未定义”

来自分类Dev

错误:.post()需要回调函数,但[对象未定义]无法正常工作

来自分类Dev

错误:Route.get()需要回调函数,但得到了[object Promise]

来自分类Dev

Route.get()需要回调函数,但是得到了[object Object]

来自分类Dev

错误:Route.get()需要回调函数,但得到了一个[object String]

来自分类Dev

使用多输出matlab函数时,是否需要回调所有变量?

来自分类Dev

.get()需要回调函数,但有一个[object Undefined]

来自分类Dev

错误:Route.post()需要回调函数,但有一个[object Undefined]

来自分类Dev

Router.use() 需要回调函数但得到一个 [object Object]

来自分类Dev

需要帮助将 Ruby 函数转换为 Python 函数

来自分类Dev

TypeError:需要Future或协程

来自分类Dev

函数调用转换列表是将字母字符转换为数字

Related 相关文章

  1. 1

    错误:需要回调函数

  2. 2

    (为什么)jQuery .click()需要回调函数?

  3. 3

    (为什么)jQuery .click()需要回调函数?

  4. 4

    我们如何在需要协程的情况下调用正常函数?

  5. 5

    如何使用两个回调将函数调用转换为Promise

  6. 6

    如何将协程Flow <List <T >>转换为List <T>

  7. 7

    使用协程使函数返回在回调中获得的值

  8. 8

    电机错误:需要回调

  9. 9

    从基于生成器的协程转换为本地协程

  10. 10

    在Python中从协程调用协程

  11. 11

    在Python中从协程调用协程

  12. 12

    将字符向量转换为函数调用

  13. 13

    如果从协程调用非暂停函数会怎样?

  14. 14

    如何使用Kotlin协程调用阻塞函数?

  15. 15

    node + mongo:更新记录需要回调

  16. 16

    节点Route.get()需要回调函数,但得到一个[对象未定义]

  17. 17

    快速路由:.get()需要回调函数,但有一个[object Object]

  18. 18

    Route.get()需要回调函数,但得到“对象未定义”

  19. 19

    错误:.post()需要回调函数,但[对象未定义]无法正常工作

  20. 20

    错误:Route.get()需要回调函数,但得到了[object Promise]

  21. 21

    Route.get()需要回调函数,但是得到了[object Object]

  22. 22

    错误:Route.get()需要回调函数,但得到了一个[object String]

  23. 23

    使用多输出matlab函数时,是否需要回调所有变量?

  24. 24

    .get()需要回调函数,但有一个[object Undefined]

  25. 25

    错误:Route.post()需要回调函数,但有一个[object Undefined]

  26. 26

    Router.use() 需要回调函数但得到一个 [object Object]

  27. 27

    需要帮助将 Ruby 函数转换为 Python 函数

  28. 28

    TypeError:需要Future或协程

  29. 29

    函数调用转换列表是将字母字符转换为数字

热门标签

归档