26template<
typename F,
typename... Args>
28 (std::same_as<std::invoke_result_t<F, Args...>,
void> ||
29 std::same_as<std::invoke_result_t<F, Args...>, awaitable<void>>);
35template<
typename... Args>
47 roboctrl::spawn(invoke_callbacks(fns_, std::make_tuple(std::move(args)...)));
56 using result_t = std::invoke_result_t<F, Args...>;
57 if constexpr (std::same_as<result_t, awaitable<void>>) {
58 fns_.push_back(std::function<
awaitable<void>(Args...)>(std::forward<F>(f)));
72 std::tuple<std::decay_t<Args>...> call_args) {
73 for (
auto& fn : fns) {
75 co_await std::apply(fn, call_args);
76 }
catch (
const std::exception& error) {
77 logger::instance().log_error(
"callback failed: {}", error.what());
79 logger::instance().log_error(
"callback failed with an unknown exception");
84 std::vector<std::function<awaitable<void>(Args...)>> fns_;
void operator()(Args... args) const
触发所有回调。
约束回调类型可被调用且返回 void 或 awaitable<void>。
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
asio::awaitable< T > awaitable
协程任务类型。