我有一个相当通用的工作队列。它需要一些 std::function<void(void)>
并在 N 个工作线程上执行它们。闭包 + 类型删除效果很好。
但是现在,我希望函数“返回”某些状态,并且我希望队列对可能的类型一无所知。为此,我正在考虑使用
std::function <std::function<void(void)>(void)>
如果我能保持语法直截了当,它是一个接受 void 并返回一个函数接受 void 并返回 void 的函数。想法是添加第二个工作队列以返回任务执行的结果。
虽然这并不能严格解决问题 - 然后我可以调用返回值,但这显然不允许我检索状态。
我可以返回 boost::any,它似乎没有告诉我包含的类型是什么,或者 boost::variant,这意味着为任务库提供所有可能返回类型的列表。两者都不理想。
我想做的是对解释仿函数中函数调用结果所需的信息进行编码,但我没有找到一种干净的方法来实现这一点。将一个 execute() 和一个 extract() 方法捆绑到一个 void(void) 仿函数中超出了我的狡猾。
另一种解决方法是异构工作队列,但用 C++ 编写这样的东西也很痛苦。我很乐观地认为,有一种惯用的解决方案可以获取执行类型删除代码所产生的未知类型,但猜测搜索关键字对我来说并不顺利。指导将不胜感激。
编辑:应用程序代码的预期工作流概述,与工作队列/线程池层不同
- 构造一个或多个异步执行的任务
- 将任务打包为
std::function</*consistent type*/>
- 推送到图书馆提供的队列
- 暂时做一些其他事情
- 从队列中检索某种不透明类型
- 将这个不透明类型传递给一个计算出它实际是什么的函数
- 一切顺利
编辑:正如评论中所建议的,类型删除是双向的。 让泛型仿函数为:
struct functor
{
typedef std::function<void(void)> functype;
functype async;
functype result;
};
然后使用 queue<functor>
的实例用于发送和接收。异步在远程线程上运行。当仿函数的实例返回时,我们不知道它代表什么,但是 result() 成员可以执行任何下一步被认为是合理的。这可能就足够了。
最佳答案
(从我的评论中复制):
与其让第 6
步知道精确的具体类型,不如使用动态或静态多态性来解决您的问题呢?
关于c++ - 反转类型删除,即之后取回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30967194/