注意:即使在C ++ 17中,以下内容也是非法的!
#include <thread>
#include <future>
#include <experimental/future>
using namespace std;
int step1(experimental::future<int>)
{
return {};
}
int step2(experimental::future<int>)
{
return {};
}
int step3(experimental::future<int>)
{
return {};
}
int main()
{
return async([](){ return {}; })
.then(step1)
.then(step2)
.then(step3)
.get();
}
C ++ 1z提供了两种future
:
std::future
std:experimental::future
但是,std::async
仅返回std::future
,因此上述代码是非法的。如果std::async
返回std:experimental::future
,则表示没问题。
我的问题是:
有没有办法将std::async
与std::experimental::future
一起使用,使C ++ 1z下的代码合法化?
答案 0 :(得分:3)
有没有办法将
std::async
与std::experimental::future
一起使用,使C ++ 1z下的代码合法化?
不。 std::async
会返回一个std::future<T>
,尽管名称是std::experimental::future<T>
,但它与async
完全不相关。
您必须编写自己的future
版本,为您提供新的template <class F, class... Args,
class R = std::invoke_result_t<std::decay_t<F>, std::decay_t<Args>...>>
std::experimental::future<R> new_async(F&& f, Args&&... args)
{
std::experimental::promise<R> p;
auto fut = p.get_future();
std::thread thread([p=std::move(p), f=std::forward<F>(f),
args=std::tuple<std::decay_t<Args>...>(std::forward<Args>(args)...)] () mutable
{
try
{
if constexpr(std::is_void_v<R>)
{
std::apply(std::move(f), std::move(args));
p.set_value();
}
else
{
p.set_value(std::apply(std::move(f), std::move(args)));
}
}
catch(...)
{
p.set_exception(std::current_exception());
}
});
thread.detach();
return fut;
}
种类。简化版本可能是:
async
这不支持像POST newindex/test/1460333
{
"title": "Your top FIY tips",
"content": "Fix It Yourself in April 2012.",
"tags": [
{
"tagName": "Fix it yourself"
},
{
"tagName": "customer tips"
},
{
"tagName": "shoud not return"
}
]
}
POST newindex/test/1460
{
"title": "Your top FIY tips",
"content": "Fix It Yourself in April 2012.",
"tags": [
{
"tagName": "Fix it yourself"
},
{
"tagName": "customer tips"
},
{
"tagName": "competition"
}
]
}
这样的其他启动策略,但它只是一个开始。
答案 1 :(得分:0)
seems like std::experimental::future
与std::future
具有相同的构造函数,因此应该可以从std::experimental::future
构造std::future
。但是,pointed out ildjarn根据the latest draft实际上不是https://console.ng.bluemix.net/docs/openwhisk/openwhisk_alarms.html#openwhisk_catalog_alarm,因此在TS相应更改之前似乎无法做到这一点。