gpt4 book ai didi

c++ - 使用 boost::future 和 "then"延续

转载 作者:IT老高 更新时间:2023-10-28 12:54:14 32 4
gpt4 key购买 nike

C++ 11 std::future lacks then 方法将延续附加到 future 。

Boost boost::future provides这个,还有一个example (我无法运行)

我只是无法编译:

#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) {
...

我觉得自己很愚蠢;)这是怎么回事?我正在使用带有 libc++ 和 Boost 1.55 的 clang 3.4(来自 Boost 网站的未经修改的原版资源)。

如果能得到提示会很好,可能还有一个示例,说明如何使用 .then(..) 修改示例以打印结果。

解决方案(赞 @dyp):

#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread/future.hpp>

在为 C++ 11(提供 future )编译时似乎是必需的,但仍然想使用 Boost future 。

为了实际使用延续,另一个定义是必要的: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");
});
}

最佳答案

Boost.Thread 有多个版本,您可以通过 BOOST_THREAD_VERSION 宏来选择这些版本。目前,默认为 2

直到 Boost.Thread 版本 2,名称 boost::unique_future 用于此类模板(与 boost::shared_future 相比)。可能是因为 std::future 的标准化,最近的版本可以使用名称boost::future。从版本 3 开始,boost::future 是默认名称。

通过预处理宏选择要使用的名称:

When BOOST_THREAD_VERSION==2 define BOOST_THREAD_PROVIDES_FUTURE if you want to use boost::future. When BOOST_THREAD_VERSION>=3 define BOOST_THREAD_DONT_PROVIDE_FUTURE if you want to use boost::unique_future.

来自 boost docs: unique_future vs future


因此,您可以使用 BOOST_THREAD_PROVIDES_FUTURE 显式启用 boost::future 或通过设置 BOOST_THREAD_VERSION 切换到更现代的 Boost.Thread 版本>到4,例如。

关于c++ - 使用 boost::future 和 "then"延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597948/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com