当使用 C 风格的返回码来指示错误时,很常见的是这样的代码:
if (do_something()) {
do_something_else();
} else {
report_failure();
}
有时,如果一个 block 比另一个 block 大得多,您可能希望在“do_something_else” block 之前重新排序“handle failure” block 。
if (!do_something()) {
report_failure();
} else {
do_something_else();
}
(或者,当它真的是 C 代码时,代码可能是 0
表示成功而不是失败,但让我们忽略它。)
当我使用像 boost::optional
这样的 C++ 习语或建议的 std::expected
类型之一时,通常我想做的是在if 语句的条件:
if (auto ok = do_something()) {
do_something_else(*ok);
} else {
report_failure(ok.error());
}
我喜欢这样做,因为这样,ok
就严格包含在范围内,在两个 block 之外是不可见的。
但是,一旦我这样做了,我就不能根据需要重新排序这两个分支,这可能比它应该的更让我烦恼,但仍然如此。
我真正想要的是语法
if not (auto ok = do_something()) {
report_failure(ok.error());
} else {
do_something_else(*ok);
}
但据我所知这实际上不起作用。
有什么技巧可以做到吗?
最佳答案
C++17将介绍这种语法:
if (auto ok = do_something(); !ok) {
report_failure(ok.error());
} else {
do_something_else(*ok);
}
这基本上就是您想要的。
它在 feature-complete draft 中.
关于c++ - 如何在 if 语句中结合否定和声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38424949/