c++ - 如何在 if 语句中结合否定和声明?

标签 c++

当使用 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/

相关文章:

c++ - 分配给右值 : why does this compile?

c++ - 如何在 C++ 中存储大矩阵

c++ - Lambda 中的指针引用

c++ - std::deque、引用和 'pop'

c# - 检查 3D 点是否位于给定的 3D 线上(两个 3D 点之间)

c++ - vector - 当元素有 const 成员时交换两个元素

C++、Visual Studio 2008、错误 C2556、C2371

c++ - 对在用于实时 IIS 7.0 事件记录的 Visual C++ 代码中使用 'HANDLE' 感到困惑

c++ - STL 实现中是否有中心分配双端队列或 vector ?

c# - c++ auto_ptr 与托管指针有何关系(Java、C#...)