2017-05-25 4 views
1

je lisais la nouvelle proposition C de ce qui concerne l'amélioration de std::future et std::promise ici http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3857.pdf et il ditboost :: avenir .alors() continuations boost retour :: avenir

Il est une situation commune que le corps de un objet de fonction alors lui-même sera une opération future, ce qui conduit à la() renvoyant un futur>. Dans ce cas, il est presque toujours le cas que ce qui vous intéresse vraiment est l'avenir interne, alors() effectue un unwrap implicite() (voir ci-dessous) avant de retourner.

Par conséquent, dans le code suivant

auto promise = std::promise<int>{}; 
auto another_future = promise.get_future().then([](auto future) { 
    return std::async([]() { return 1; }); 
}); 

le type de another_future est std::future<int> et non std::future<std::future<int>>

Je tentais d'utiliser boost::future pour obtenir la même chose, mais il semble que continuations boost ne pas Développer implicitement le futur. Y a-t-il quelque chose que je peux faire pour permettre le même comportement à partir des contrats à terme de boost? Il semble qu'il n'y ait pas de fonction unwrap() disponible pour utiliser la fonction résultante. Suis-je obligé de déballer le futur via un constructeur manuellement? Aussi en essayant que je reçois l'erreur suivante, que dois-je faire?

inline explicit BOOST_THREAD_FUTURE(
    BOOST_THREAD_RV_REF(
     BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R> >) other); // EXTENSION 

Répondre

1

Unwrapping est une extension conditionnelle pour fil Boost:

#define BOOST_THREAD_PROVIDES_FUTURE 
#define BOOST_THREAD_PROVIDES_FUTURE_UNWRAP 
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION 
#include <boost/thread.hpp> 

int main() { 
    auto promise = boost::promise<int>{}; 
    boost::future<int> another_future = 
     promise.get_future().then([](auto) { 
      return boost::async([]() { return 1; }); 
     }).unwrap(); 
}