微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在可以从函数返回的cpp中编写此宏

如何解决如何在可以从函数返回的cpp中编写此宏

我使用 cpp 变体来指示我的程序中的错误,例如,我有一个这样的函数

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,则可以使用 statement 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);          \
  })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。