【问题标题】:Anonymous std::packaged_task匿名 std::packaged_task
【发布时间】:2013-04-23 00:43:40
【问题描述】:

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

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

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

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

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

我的问题是:如何通过两个步骤从std::packaged_task&lt;R()&gt;std::packaged_task&lt;void()&gt; 创建,以便我可以从第一个任务返回它的未来并将第二个任务放入std::queue&lt;std::packaged_task&lt;void()&gt;&gt; 类型的队列中?

【问题讨论】:

  • 也可以是其他函子类型,而不是std::packaged_task&lt;void()&gt;;他们都只需要隐藏fargs...
  • 我找到了一种使用类型擦除来实现的方法,但是有什么方法可以使用 stl 来解决我的问题吗?

标签: c++ thread-safety packaged-task


【解决方案1】:

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

其次,如果您在构造时绑定参数,那么您的 std::packaged_task 实例是一个不带参数并返回 void 的可调用对象,因此可以直接移动std::packaged_task&lt;void()&gt; .

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

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;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多