[英]How to write this macro in cpp that can return from the function
我正在使用 cpp 變體來指示我的程序中的錯誤,例如,我有一個 function 像這樣:
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,則可以使用語句 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); \
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.