在
jQuery version of “Deferreds”(C称为“期货”)中,.then()方法将其签名不包含任何未来的函数作为其参数.然而,为C 17(
see N3721)提出的.then()在其签名中采用了具有未来的函数.
即,如果我想在背景中计算f(g(x))“,N3721希望我写
extern int f(int);
extern int g(int);
auto async_fg(int x) {
return std::async(f, x).then([](std::future<int> mid) {
return g(mid.get());
});
}
我很想写一个包装器,像这样:
template<class F>
auto futurize(F&& f) {
return [](auto mid) {
return std::forward<F>(f)(mid.get());
};
}
auto async_fg(int x) {
return std::async(f, x).then(futurize(g));
}
但是,这两种解决方案看起来都很尴除此之外,我不知道我在这里称之为“未来化”的操作的正确名称.如果之前已经提出过此操作,那么有人称它为何?
显然,如果未来< T>,则更好的界面将是如此.有一个带语义的新成员函数
template<class T, class F>
auto future<T>::then_futurize(F&& f)
{
return this->then(futurize(std::forward<F>(f)));
}
auto async_fg(int x) {
return std::async(f, x).then_futurize(g);
}
这个构造有没有(现有的)名称? (我刚刚编写了名称then_futurize,我不喜欢它.)
我会接受任何现有语言或库的答案(Javascript,Python,Ruby,C Boost,C Folly ……);它们不一定是具体的C标准提案,尽管显然这是最好的.
我已经注意到Folly’s version of .then()
采用带有签名X(未来< Y>)或X(Y)的函数;但我想这会在一些极端情况下变得模棱两可.此外,未来的.then()和“便利包装”.then()似乎是完全不同的操作,我更喜欢它们的不同名称.
最佳答案 啊哈!
N3865具有与我调用的相同的原语.then_futurize(); N3865称之为.next()!
auto async_fg(int x) {
return std::async(f, x).next(g);
}
N3865还提供了一个对应的.recover(),允许Javascript风格的延续构造:
std::future<std::string> f2 = f1.next(
[](int v) {
return v.to_string();
}
).recover(
[](exception_ptr ex) {
return "nan";
}
);
它还提供了许多其他很酷的便利包装器,例如.has_value()和.value_or().
(我没有看到我的futurize()的任何名称,但.then_futurize()肯定被命名为.next().)