ネストされた先物を単一の先物に「フラット化」するために使用するヘルパー関数があります。
編集:提案されているように、「fold」の名前を「flatten」に変更しました。
Boostライブラリの先物を使用しています:
template<typename T>
auto flatten(boost::unique_future<T>&& f) -> boost::unique_future<decltype(f.get().get())>
{
auto shared_f = boost::shared_future<T>(std::move(f));
return async(launch_policy::deferred, [=]() mutable
{
return shared_f.get().get();
});
}
これは次のように使用されます。
auto nested_future_result = async([]() -> boost::shared_future<int>
{
auto tmp = async([]
{
return 1;
});
return boost::shared_future<int>(std::move(tmp));
});
boost::unique_future<int> future_result = flatten(nested_future_result);
int result = future_result.get();
問題は、これは「ネストされた」未来をに変換した場合にのみ機能することshared_future
です。それを回避するための良い方法はありますか?私が欲しいのは次のようなものです:
auto future_result = flatten(async([]
{
return async([]
{
return 1;
});
}));
int result = future_result.get();
第二に、メソッドの名前が少しわかりません。何か意見はありますか?