gpt4 book ai didi

c++ - 匿名 std::packaged_task

转载 作者:太空狗 更新时间:2023-10-29 21:25:13 25 4
gpt4 key购买 nike

我正在尝试围绕 Glib::Dispatcher 构建一些包装器,以将任何功能类型分派(dispatch)到分派(dispatch)器中。我想要一些可以将函数传输到 Glib 主循环中的函数分派(dispatch):

template<class Function, class ...Args>
std::future<typename std::result_of<Function(Args...)>::type>
dispatch(Function &&f, Args &&...args);

这个函数将从 f(args) 创建一个打包任务并返回它的 future :

std::packaged_task<typename std::result_of<Function(Args...)>::type()> task(f(args...));
return task.get_future();

我现在需要从这个任务中创建一个 std::packaged_task<void()>将它们放入一个 std::queue 以便连接到 Glib::Dispatcher 的函数可以执行它们。

我的问题是:如何从 std::packaged_task<R()> 创建一个std::packaged_task<void()>分两步,这样我就可以从第一个任务返回它的 future 并将第二个任务放入队列 std::queue<std::packaged_task<void()>>类型?

最佳答案

首先,要有 std::packaged_task调用具有给定参数集的特定函数,然后 (a) 在将函数传递给 std::packaged_task 之前,您需要将函数绑定(bind)到参数, 或者 (b) 您需要将参数传递给 std::packaged_task 的函数调用运算符目的。在您的代码中,您正在传递 f(args...)std::packaged_task构造函数,它将在那里调用函数,然后将结果传递给构造函数,这可能不是您想要的,甚至可能无法编译。

其次,如果您在构造时绑定(bind)参数,那么您的 std::packaged_task instance 是一个可调用对象,不带参数并返回 void , 所以可以移动直接进入 std::packaged_task<void()> .

将所有这些放在一起,我们得到:

std::queue<std::packaged_task<void()>> task_queue;

template<class Function, class ...Args>
std::future<typename std::result_of<Function(Args...)>::type>
dispatch(Function &&f, Args &&...args) {
std::packaged_task<typename std::result_of<Function(Args...)>::type()> task(
std::bind(f,args...));
auto res=task.get_future();
task_queue.push(std::packaged_task<void()>(std::move(task)));
return res;
}

关于c++ - 匿名 std::packaged_task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14335161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com