2

ネストされた先物を単一の先物に「フラット化」するために使用するヘルパー関数があります。

編集:提案されているように、「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();

第二に、メソッドの名前が少しわかりません。何か意見はありますか?

4

1 に答える 1

2

boost::unique_future(注:どのように協力したのかわからないので、のすべてのインスタンスをstd::asyncに置き換えました。コードはテストされ、私の側で機能します。)boost::unique_futurestd::future

問題は、ラムダ式が値(実際にはコピーによるキャプチャを意味します)または参照(将来の存続期間をクロージャに結び付けたいため、ここでは適用されません)のいずれかでキャプチャするのに対し、std::future移動のみであるということです。その答えは通常std::bindですが、この場合std::asyncは組み込みのbindような機能があります。

template<typename T>
auto fold(std::future<T>&& f)
-> std::future<decltype(f.get().get())>
{
    return std::async(std::launch::deferred, [](std::future<T>&& f)
    {
        return f.get().get();
    }, std::move(f));
}

恐れ入りますが、お勧めできる名前がありません。テンプレートが再帰的に機能していずれかをに変換する場合std::future<std::future<std::future<...std::future<T>...>>>std::future<T>、おそらくifを呼び出しますflatten_future。または、おそらく単純flattenに、結局のところ、それはstd::futureそもそもを受け入れるだけだからです。


すでに単項があると仮定しますasync

template<typename Functor, typename Arg, typename... Args>
auto async(Functor&& functor, Arg&& arg, Args&&.... args)
-> decltype( async(std::bind(std::forward<Functor>(functor)
    , std::forward<Arg>(arg), std::forward<Args>(args)...)) )
{
    return async(std::bind(std::forward<Functor>(functor)
        , std::forward<Arg>(arg), std::forward<Args>(args)...));
}
于 2012-02-18T02:48:50.143 に答える