在下面的示例代码中,我想创建一个 Item
来自 Component
的对象:
struct Component { };
struct Item {
explicit Item(Component component) : comp(component) {}
Component comp;
};
struct Factory {
static std::future<Item> get_item() {
std::future<Component> component = get_component();
// how to get a std::future<Item> ?
}
std::future<Component> get_component();
};
我如何从 std::future<Component>
开始至 std::future<Item>
?
更新:从问题中删除了我的第一个想法(基于线程)并发布了一个答案。
最佳答案
需要 moar packaged_tasks!
std::future<Item> get_item() {
std::packaged_task<Item()> task([]{
return Item(get_component().get());
});
auto future = task.get_future();
std::thread(std::move(task)).detach();
return future;
};
一般来说,我建议忘记 promises 并首先考虑 packaged_tasks。 packaged_task
负责为您维护一个(函数、 promise 、 future )三元组。它允许您以自然的方式编写函数(即返回和抛出等),并将异常正确传播到您的示例忽略的 future (任何线程中未处理的异常std::terminate
你的程序!)。
关于c++ - 从中间 future 创造 future ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14877007/