是否有可能改造未来类型?
Is it possible to transform a future type?
使用具有类似方法的库:
std::future<bool> action();
我发现自己处于必须符合项目特定 enum
return 类型的情况,例如:
enum Result { Ok, Failed, ConnectionDown, ServerError };
动作的调用点如下所示:
std::future<Result> act()
{
try {
return _actor->action(); // This returns a different type :(
// What to do here ??? ^
}
catch (ConnectionError const& e)
{
return std::make_ready_future<Result>(Result::ConnectionError);
}
catch (ServerError const& e)
{
return std::make_ready_future<Result>(Result::ServerError);
}
}
所以基本上库没有针对错误情况的特定 return 代码,它们是作为异常发出的。处理起来很容易,因为我可以构建具有适当价值的现成期货。问题(具有讽刺意味的是)与非例外路径有关,其中图书馆的 std::future<bool>
必须转换为 std::future<Result>
.
.get()
结果并根据它的值(true -> Ok,false -> Failed)构建一个现成的未来是没有意义的,因为这样我就从我的函数中删除了异步性。有没有更好的方法来处理这个问题?
等待继续功能(std::experimental::future::then
)
,你可能想要这样的东西:
std::future<Result> act()
{
return std::async([&](){
try {
if (_actor->action().get()) {
return Result::Ok;
} else {
return Result::Failed;
}
}
catch (ConnectionError const& e) {
return Result::ConnectionError;
}
catch (ServerError const& e) {
return Result::ServerError;
}
});
}
使用具有类似方法的库:
std::future<bool> action();
我发现自己处于必须符合项目特定 enum
return 类型的情况,例如:
enum Result { Ok, Failed, ConnectionDown, ServerError };
动作的调用点如下所示:
std::future<Result> act()
{
try {
return _actor->action(); // This returns a different type :(
// What to do here ??? ^
}
catch (ConnectionError const& e)
{
return std::make_ready_future<Result>(Result::ConnectionError);
}
catch (ServerError const& e)
{
return std::make_ready_future<Result>(Result::ServerError);
}
}
所以基本上库没有针对错误情况的特定 return 代码,它们是作为异常发出的。处理起来很容易,因为我可以构建具有适当价值的现成期货。问题(具有讽刺意味的是)与非例外路径有关,其中图书馆的 std::future<bool>
必须转换为 std::future<Result>
.
.get()
结果并根据它的值(true -> Ok,false -> Failed)构建一个现成的未来是没有意义的,因为这样我就从我的函数中删除了异步性。有没有更好的方法来处理这个问题?
等待继续功能(std::experimental::future::then
)
,你可能想要这样的东西:
std::future<Result> act()
{
return std::async([&](){
try {
if (_actor->action().get()) {
return Result::Ok;
} else {
return Result::Failed;
}
}
catch (ConnectionError const& e) {
return Result::ConnectionError;
}
catch (ServerError const& e) {
return Result::ServerError;
}
});
}