- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试围绕 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/
正在关注 this excellent tutorial对于futures、promises 和打包任务,我到了要准备自己的任务的地步 #include #include using namesp
在下面的程序中,我试图创建一个带有成员函数的 packaged_task: #include using namespace std; struct S { int calc(int& a)
我天真地期望它能编译: template auto run(Func && func) { auto package = std::packaged_task{std::forward(fu
我正在尝试使用这样的仿函数创建一个打包任务: Worker w(someString, anotherString, i*length,length); boost::packaged_task ta
我试图绕过 std::packaged_task 缺少复制构造函数的问题,以便我可以将它传递给 std::function(它只会被移动)。 我继承自 std::packaged_task 并添加了一
嗨,我不知道如何编写一个正确的队列绑定(bind)并执行传递给方法 OCRQueue::enqueue() 的 lambda 表达式 // the task queue std::queue > ta
编译下面的程序时,出现错误信息: 错误 1 错误 C2228:'.get_future' 的左侧必须具有类/结构/union c:\users\haliaga\documents\visual s
我正在分析以下代码片段并试图详细理解它: template auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments )
我从 http://en.cppreference.com/w/cpp/thread/packaged_task 中的部分代码中复制了一个奇怪的核心转储, #include #include #i
我正在尝试采用 std::async 风格的“任务”并将其存储在容器中。我必须克服困难才能实现它,但我认为一定有更好的方法。 std::vector> mTasks; template std::fu
我最近在我的项目上运行 valgrind --tool=helgrind 并收到警告“可能的数据竞争”,我认为这是令人担忧的。然而,即使是这个简单的测试程序也会导致此消息: #include #in
我正在尝试使用 packaged_task 实现异步。我正在通过一个模板化函数 bsync 来尝试这个。 bsync 接受 2 个参数:一个函数 f 和一个参数包 args,并返回一个 future
我一直在寻找 problem of type-erasing a std::packaged_task using std::function 的解决方法. 我想做的是这样的: #include #
我正在玩 Antony Williams - C++ Concurrency in Action 一书中的示例 4.14,其中使用 std::packaged_task 和 std::thread 模
我试图将 std::packaged_task 包装在另一个类中,以便与任务调度程序一起使用。 目前,除了 std::future 支持外,我的一切都正常工作。为了获得 std::future 支持,
我正在尝试围绕 Glib::Dispatcher 构建一些包装器,以将任何功能类型分派(dispatch)到分派(dispatch)器中。我想要一些可以将函数传输到 Glib 主循环中的函数分派(di
std::packaged_task 模板有一个接受分配器的构造函数: packaged_task pt {allocator_arg_t, a, f}; 我想问: 1) 它的存在表明 package
是否有一种标准方法可以将 std::packaged_task 添加到现有线程?在任务运行之前必须发生大量开销,所以我想这样做一次,然后保持线程运行并等待任务执行。我希望能够使用 futures,这样
我正在尝试将 packaged_task 包装在 lambda 中,以便将它们存放在容器中。我在下面写了一个测试代码来模拟包装和调用 lambda 函数。我的代码如下: int test() {
在使用 C++11 的线程模型时,我注意到 std::packaged_task task([](int a, int b) { return a + b; }); auto f = task.get
我是一名优秀的程序员,十分优秀!