Boost C++ 库

...世界上最受尊敬和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

HomeNext

Outcome 2.2 库

Niall Douglas

根据 Boost 软件许可,版本 1.0 分发。(请参阅随附文件 LICENSE_1_0.txt 或访问 https://boost.ac.cn/LICENSE_1_0.txt 副本)

目录

先决条件
构建和安装
错误处理框架回顾
std exception 抛出
std 错误代码
std expected
Outcome (提议的 std result)
LEAF
动机
异常
errno
错误代码
std::error_code
将库插入到 std::error_code
将库插入到 boost::system::error_code
窄契约
未来的 ABI 稳定性保证
教程
基础
高级
示例
ASIO/网络 TS : Boost < 1.70
ASIO/网络 TS: Boost >= 1.70
扩展 BOOST_OUTCOME_TRY
实验性
主要优势
错误代码设计的大致映射
主要差异
status_resultstatus_outcome
整合在一起
示例:自定义域(简短方式)
示例:自定义域(冗长方式)
从 C 代码中使用 Outcome
API 参考
概念
转换器
特性
策略
类型
别名
函数
常见问题解答
视频
更新日志
升级指南 v2.1 => v2.2
v2.2 主要变更
历史

简介

注意

在 2021 年 12 月底,独立 Outcome 保证了未来的 ABI 稳定性。 从 v2.2.3 版本开始,您将在 Outcome 版本之间获得 ABI 兼容性保证。

Outcome 是一组用于报告和处理函数失败的工具,适用于直接使用 C++ 异常处理不合适的场合。 这些场合包括

Outcome 通过从函数返回一种特殊类型来处理失败,这种类型能够存储成功计算的值(或 void),或有关失败的信息。 Outcome 还附带一组用于处理此类类型的习惯用法。

已特别注意确保 Outcome 对构建时间的影响尽可能低,从而使其适用于真正大型代码库的全局标头中使用。 存储布局是有保证的,并且与 result<T, E>1 的 C 兼容,从而使基于 Outcome 的代码具有长期 ABI 稳定性。

Outcome 中完全确定性的 all-noexcept C++ 协程支持特别强大,我们提供 Outcome 优化的 eager<T, Executor = void>/atomic_eager<T, Executor = void> , lazy<T, Executor = void>/atomic_lazy<T, Executor = void>generator<T, Executor = void> awaitables,它们适用于任何用户类型。

示例用法 (C++)

Outcome 库中的主要工作组件是 result<T>:它表示类型 T 的成功计算值,或表示失败原因的 std::error_code/boost::system::error_code2。 您在函数的返回类型中使用它

outcome::result<string> data_from_file(string_view path) noexcept;
在 Github 上查看此代码

可以手动检查状态

if (outcome::result<string> rslt = data_from_file("config.cfg"))
  use_string(rslt.value());                   // returns string
else
  throw LibError{rslt.error(), "config.cfg"}; // returns error_code
在 Github 上查看此代码

或者,如果此函数在另一个也返回 result<T> 的函数中调用,则可以使用专用控制语句

outcome::result<int> process(const string& content) noexcept;

outcome::result<int> int_from_file(string_view path) noexcept
{
  BOOST_OUTCOME_TRY(auto str, data_from_file(path));
  // if control gets here data_from_file() has succeeded
  return process(str);  // decltype(str) == string
}
在 Github 上查看此代码

BOOST_OUTCOME_TRY 是一个控制语句。 如果返回的 result<T> 对象包含错误信息,则封闭函数会立即返回,并返回包含相同失败信息的 result<U>; 否则,类型为 T 的自动对象在作用域内可用。

示例用法 (C)

等效于 C++ API:BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(ident, T) 声明 C 类型,此后 BOOST_OUTCOME_C_RESULT_SYSTEM(ident) 引用它。 您在函数的返回类型中使用它

BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(result_string, const char *)

BOOST_OUTCOME_C_RESULT_SYSTEM(result_string) data_from_file(const char *path);
在 Github 上查看此代码

可以手动检查状态

  BOOST_OUTCOME_C_RESULT_SYSTEM(result_string) rslt = data_from_file("config.cfg");
  if(BOOST_OUTCOME_C_RESULT_HAS_VALUE(rslt))
    use_string(rslt.value);  // returns string
  else
    fprintf(stderr, "%s\n", outcome_status_code_message(&rslt.error));
在 Github 上查看此代码

或者,如果此函数在另一个也返回 BOOST_OUTCOME_C_RESULT_SYSTEM(ident) 的函数中调用,则可以使用专用控制语句

BOOST_OUTCOME_C_DECLARE_RESULT_SYSTEM(result_int, int)

BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) process(const char *content);

BOOST_OUTCOME_C_RESULT_SYSTEM(result_int) int_from_file(const char *path)
{
  BOOST_OUTCOME_C_RESULT_SYSTEM_TRY(const char *str, result_int, /* cleanup on fail */, data_from_file(path));
  // if control gets here data_from_file() has succeeded
  return process(str);  // decltype(str) == string
}
在 Github 上查看此代码

C Result 保证其布局与其 C++ 等效项相同。 提供了便捷的转换函数,但您也可以进行 reinterpret_cast。

注意

该库在 1.70 版本(2019 年春季)加入了 Boost C++ 库如果需要,它可以嫁接到更旧的 Boost 版本中


  1. 如果您选择 C 兼容的 TE 类型。 [返回]
  2. result<T> 默认为独立 Outcome 的 std::error_code,以及 Boost.Outcome 的 boost::system::error_code。 您可以使用 std_result<T>boost_result<T> 强制选择。 [返回]

最后修订:2024 年 7 月 16 日 21:33:35 +0100


Prev HomeNext