Я хотел бы использовать boost::future
с продолжениями и boost::when_all
/boost::when_any
.
Boost trunk — не 1.55 — включает реализации для последнего (по образцу предложения здесь, ожидается для C++ 14/17 и Boost 1.56).
Это то, что у меня есть (и не компилируется):
#include <iostream>
#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#define BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
#include <boost/thread/future.hpp>
using namespace boost;
int main() {
future<int> f1 = async([]() { return 1; });
future<int> f2 = async([]() { return 2; });
auto f3 = when_all(f1, f2);
f3.then([](decltype(f3)) {
std::cout << "done" << std::endl;
});
f3.get();
}
Clang 3.4 выручает это — вот выдержка:
/usr/include/c++/v1/memory:1685:31: error: call to deleted constructor of 'boost::future<int>'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
Я делаю это неправильно или это ошибка?
get
вернутьfuture
изthen
вместоf3
, т. е.auto f4 = f3.then(...); f4.get();
- person Casey   schedule 26.03.2014when_all
принимает итераторы, если я правильно прочитал исходный код. Вы не используете итераторы. Вы пытались поместить фьючерсы в вектор и вместо этого вызватьwhen_all(vec.begin(), vec.end())
? - person stefan   schedule 26.03.2014when_all
.. одна с позиционными аргументами, другие итераторы. - person oberstet   schedule 26.03.2014when_all
по значению, которое хочет их скопировать. Поскольку фьючерсы доступны только для движения, вселенная взрывается. Переместите их:auto f3 = when_all(std::move(f1), std::move(f2));
или опустите названные временные файлы:auto f = when_all(async([]{return 1;}), async([]{return 2;}));
Кроме того, я считаю N3857 — самая последняя версия этого предложения. - person Casey   schedule 26.03.2014std::vector
изstd::intializer_list
пытаясь скопировать фьючерсы. - person Casey   schedule 26.03.2014