如果我正在编写一个返回std::expected
对象的函数,并可能调用其他返回std::expected
对象的函数,我发现自己编写这样的代码片段非常常见。
struct Foo { };
std::expected<Foo, std::string> f();
auto res = f();
if(!res) return std::unexpected { res.error() };
auto val = res.value();
// do something with val
所以我写了一个像这样的宏,在成功的情况下“返回”值,在失败的情况下返回错误。
#define CHECK(expr)\
({\
auto res = expr;\
if(!res) return std::unexpected { res.error() };\
res.value();\
})
我可以这样使用它:
Foo foo = CHECK(f());
我假设内部作用域中变量的生存期应该和赋值表达式一样长。是这样吗?有没有可能出问题的情况?
1条答案
按热度按时间uxhixvfz1#
有了这个宏,你可以写这样的函数:
我认为避免这种模式是monadic方法
std::expected<T,E>::and_then
的目的:在这种情况下,它可以进一步缩短:
尽管现实地说,我认为写出这些语句在实际代码中是更常见的情况。
浏览器浏览器:https://godbolt.org/z/vovTYfxf4