C++包含返回的宏表达式(如 Rust 的尝试!

C++ macro expression containing return (like Rust's try!)

本文关键字:Rust 表达式 包含 返回 C++      更新时间:2023-10-16

Rust 有一个宏,它是一个表达式,要么计算到某个值,要么从函数返回。有什么办法可以在C++做到这一点吗?

像这样:

struct Result
{
    bool ok;
    int value;
}
Result foo() { ... }
#define TRY(x) (auto& ref = (x), ref.ok ? ref.value : return -1)
int main()
{
    int i = TRY(foo());
}

不幸的是,它不起作用return因为它是一个陈述而不是一个表达式。上面的代码还有其他问题,但它大致给出了我想要的想法。有人有什么好主意吗?

多亏

了NathanOliver的链接,看起来你可以用语句表达式来做到这一点,而这些表达式显然只受Clang和GCC的支持。像这样:

#define TRY(x)                                                     
    ({                                                             
        auto& ref = (x);                                           
        if (!ref.ok) {                                             
            return -1;                                             
        }                                                          
        ref.value; // The block evaluates to the last expression.  
    })