【发布时间】:2023-12-13 12:00:02
【问题描述】:
在jQuery version of "Deferreds"(C++ 称之为“期货”)中,.then() 方法将其签名不包含任何期货的函数作为其参数。而为 C++17 (see N3721) 提议的 .then() 采用了一个在其签名中带有 future 的函数。
即,如果我想“在后台”计算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));
}
不过,这两种解决方案似乎都很尴尬;最重要的是,我不知道我在这里称之为“未来化”的操作的正确名称。如果以前有人提出过这种操作,人们叫它什么?
如果future<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);
}
this 结构是否有任何(现有)名称? (我只是编了个名字then_futurize,我不喜欢。)
我将接受来自任何现有语言或库(Javascript、Python、Ruby、C++ Boost、C++ Folly...)的答案;它们不必是专门的 C++ 标准提案,但显然那是最好的。
我已经注意到 Folly's version of .then() 接受一个带有签名的函数 either X(future<Y>) or X(Y);但我想这在某些极端情况下最终会变得模棱两可。此外,未来的.then() 和“便利包装”.then() 似乎是完全不同的操作,我更喜欢为它们取不同的名称。
【问题讨论】:
-
我会从单子的角度来考虑这个问题。但首先我必须学习 Haskell 和 monads。我相信 .then 是一种 monad 操作,而 unpack-and-call-.then 是另一种 haskell monad 操作,也许
>>=?哪个有英文名字,我想bind?与std::bind冲突。