GKD.RoboCtrl
载入中...
搜索中...
未找到
callback.hpp
浏览该文件的文档.
1
6#pragma once
7
8#include <concepts>
9#include <functional>
10#include <type_traits>
11#include <vector>
12#include <utility>
13
14#include "core/async.hpp"
15
16namespace roboctrl {
17
24template<typename F, typename... Args>
25concept callback_fn = std::invocable<F, Args...> &&
26 (std::same_as<std::invoke_result_t<F, Args...>, void> ||
27 std::same_as<std::invoke_result_t<F, Args...>, awaitable<void>>);
28
33template<typename... Args>
34class callback {
35public:
36 callback() = default;
37
42 template<typename... CallArgs>
43 void operator()(CallArgs&&... args) const {
44 for (auto const& fn : fns_) {
45 roboctrl::spawn(fn(std::forward<CallArgs>(args)...));
46 }
47 }
48
53 template<callback_fn<Args...> F>
54 void add(F&& f) {
55 using result_t = std::invoke_result_t<F, Args...>;
56 if constexpr (std::same_as<result_t, awaitable<void>>) {
57 fns_.push_back(std::function<awaitable<void>(Args...)>(std::forward<F>(f)));
58 } else {
59 fns_.push_back(std::function<awaitable<void>(Args...)>(
60 [fn = std::forward<F>(f)](Args... args) mutable -> awaitable<void> {
61 fn(args...);
62 co_return;
63 }
64 ));
65 }
66 }
67
68private:
69 std::vector<std::function<awaitable<void>(Args...)>> fns_;
70};
71
72} // namespace roboctrl
异步任务上下文组件。
管理一组协程回调的容器。
Definition callback.hpp:34
void add(F &&f)
添加一个新的回调。
Definition callback.hpp:54
void operator()(CallArgs &&... args) const
触发所有回调。
Definition callback.hpp:43
约束回调类型可被调用且返回 void 或 awaitable<void>。
Definition callback.hpp:25
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:151
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42