В С++ 11 std::future
отсутствует метод then
для добавления продолжений в будущее.
Boost boost::future
предоставляет это, и есть пример (который я не могу запустить)
Я просто не могу скомпилировать:
#include <iostream>
#include <string>
#include <boost/thread/future.hpp>
boost::future<int> join2(const std::string& realm) {
boost::promise<int> p;
p.set_value(23);
return p.get_future();
}
int main () {
boost::future<int> f = join2("realm1");
// here, I'd like to use f.then(..)
f.wait();
std::cout << f.get() << std::endl;
}
При компиляции
clang++ -o test5.o -c -std=c++11 -stdlib=libc++ \
-I/home/oberstet/boost_1_55_0 test5.cpp
это сворачивается с помощью
test5.cpp:30:1: error: unknown type name 'future'
future<int> join(const std::string& realm) {
...
Я чувствую себя глупо;) Что происходит? Я использую clang 3.4 с libС++ и Boost 1.55 (немодифицированные источники ванили с сайта Boost).
Было бы здорово получить подсказку, возможно, также с примером того, как изменить пример с помощью .then(..)
, чтобы распечатать результат.
Решение (kudos @dyp):
#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread/future.hpp>
по-видимому, требуется при компиляции для С++ 11 (который обеспечивает будущее), но каждый хочет использовать будущее Boost.
Для фактического использования продолжений необходимо другое определение: BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
.
Вот полный пример
#include <iostream>
#include <string>
#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>
using namespace boost;
int main() {
future<int> f1 = async([]() { return 123; });
future<std::string> f2 = f1.then([](future<int> f) {
std::cout << f.get() << std::endl; // here .get() won't block
return std::string("sgfsdfs");
});
}