2012-02-17 12 views
2

を「フラット化」私は、単一の未来にネストされた先物を「フラット化」に使用ヘルパー関数を持っています。は、ネストされた先物

私はブーストライブラリから先物を使用してい

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(); 

第2に、メソッドの名前がわかりません。どんな意見?

答えて

2

(注:私はあなたがstd::asyncと協力してboost::unique_futureを得た方法を理解していないので、私はstd::futureboost::unique_futureのすべてのインスタンスを置き換えコードがテストされ、私の終わりに取り組んでいますされています。。)

問題があることですラムダ式は、値(実際にはコピーで取得することを意味します)または参照(将来の生存期間を閉鎖するためにここでは適用されません)でキャプチャします。一方、std::futureは移動のみです。

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::async内蔵bind様な機能を持っているものの、その答えは、通常std::bindです。もしテンプレートがおそらくstd::future<std::future<std::future<...std::future<T>...>>>std::future<T>に変換するために再帰的に働いていたら、おそらく私は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)...)); 
} 
+0

私は自分の非同期を書きました。私は 'std'という接頭辞を付けてはならないことに気づいただけです。 – ronag

+0

あなたの答えにそのコメントを追加できますか?書式なしで読むのは難しいです。 – ronag

+0

簡単な質問と同じように、標準化された 'std :: async'はなぜ平坦化されませんか?それはむしろ自然なもののようです... – ronag

関連する問題