如何在 cpp 中编写这个可以从函数 return 的宏
How to write this macro in cpp that can return from the function
我正在使用 cpp 变体来指示我的程序中的错误,例如,我有一个这样的函数:
std::variant<Result, Error> do_foo();
std::variant<string, Error> do_bar() {
auto v = do_foo();
if (std::holds_alternative<Error>(v)) {
return std::get<Error>(v);
}
auto r = std::get<Result>(v);
// do some more stuff with r
return some_str;
}
但是我最终检查了很多次错误并且很乏味,所以我想写一个宏,我们称之为保释,以缩短它。所以 do_bar 可能看起来像这样:
std::variant<string, Error> do_bar() {
Result r = bail(do_foo()); // it should return if do_foo() returns an error
// do some more stuff with r
return some_str;
}
虽然不确定如何编写该宏,但有些尝试无效:
#define bail(v) { auto _v = v; \
if (_v.index() == 1) return std::get<1>(_v); \
std::get<0>(_v); }
然而,那个街区没有给我任何价值。请注意,我试图避免异常。感谢您的帮助!
您想要的在可移植 C++ 中是不可能的。如果您使用的是 gcc 或 clang,则可以使用 statement exprs。我真的建议你不要这样做,但这里是你所问问题的答案:
// Non-portable--you probably shouldn't do this
#define bail(v) ({ \
auto _v = v; \
if (_v.index() == 1) \
return std::get<1>(_v); \
std::get<0>(_v); \
})
我正在使用 cpp 变体来指示我的程序中的错误,例如,我有一个这样的函数:
std::variant<Result, Error> do_foo();
std::variant<string, Error> do_bar() {
auto v = do_foo();
if (std::holds_alternative<Error>(v)) {
return std::get<Error>(v);
}
auto r = std::get<Result>(v);
// do some more stuff with r
return some_str;
}
但是我最终检查了很多次错误并且很乏味,所以我想写一个宏,我们称之为保释,以缩短它。所以 do_bar 可能看起来像这样:
std::variant<string, Error> do_bar() {
Result r = bail(do_foo()); // it should return if do_foo() returns an error
// do some more stuff with r
return some_str;
}
虽然不确定如何编写该宏,但有些尝试无效:
#define bail(v) { auto _v = v; \
if (_v.index() == 1) return std::get<1>(_v); \
std::get<0>(_v); }
然而,那个街区没有给我任何价值。请注意,我试图避免异常。感谢您的帮助!
您想要的在可移植 C++ 中是不可能的。如果您使用的是 gcc 或 clang,则可以使用 statement exprs。我真的建议你不要这样做,但这里是你所问问题的答案:
// Non-portable--you probably shouldn't do this
#define bail(v) ({ \
auto _v = v; \
if (_v.index() == 1) \
return std::get<1>(_v); \
std::get<0>(_v); \
})