2

在我目前正在进行的项目中,我发现自己编写了很多如下所示的代码,其中get_optional_foo返回一个 std::optional :

//...
auto maybe_foo = get_optional_foo(quux, ...)
if (!maybe_foo.has_value())
    return {};
auto foo = maybe_foo.value()
//...
// continue on, doing things with foo...

如果我得到一个空选项,我想退出该功能;否则,我想为该值分配一个非可选变量。我已经开始使用使用maybe_前缀命名可选的约定,但我想知道是否有某种方法可以做到这一点,这样我就不需要为可选的临时使用?此变量仅用于检查空选项并在有值时取消引用。

4

3 回答 3

3

您不需要中间对象。std::optional支持指针接口来访问它,因此您可以像这样使用它:

//...
auto foo = get_optional_foo(quux, ...)
if (!foo)
    return {};
//...
foo->some_member;
(*foo).some_member;
于 2020-11-11T14:44:30.347 回答
1

我能想到的最短的:

auto maybe_foo = get_optional_foo(quux, ...)
if (!maybe_foo) return {};

auto &foo = *maybe_foo; // alternatively, use `*maybe_foo` below

如果函数中有多个选项并且它们不太可能为空,则可以用try - catch.

try {
  auto &foo = get_optional_foo(quux, ...).value();
  auto &bar = get_optional_bar(...).value();
  ...
} catch (std::bad_optional_access &e) {
  return {};
}
于 2020-11-11T14:43:55.640 回答
1

与您的要求略有不同,但请考虑:

  if (auto foo = get_optional_foo(1)) {
    // ...
    return foo->x;
  } else {
    return {};
  }

这会将函数的主体放在一个if()块中,这可能更具可读性。

于 2020-11-11T14:48:50.107 回答