最終更新日時(UTC):
が更新

履歴 編集

function template
<expected>

std::expected.void::or_else(C++23)

// expected<cv void, E>部分特殊化
template<class F> constexpr auto or_else(F&& f) &;        // (1)
template<class F> constexpr auto or_else(F&& f) const &;  // (2)
template<class F> constexpr auto or_else(F&& f) &&;       // (3)
template<class F> constexpr auto or_else(F&& f) const &&; // (4)

概要

エラー値を保持していれば、エラー値に対してfを適用した結果をexpectedとして返す。 正常値を保持していれば、そのまま返す。

実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。 or_elseへは、引数リストに1個のE型をとりstd::expected<T, Return>型を返す関数や関数オブジェクトを与える。

template <cv void, class E>
class expected {
  template <class Return>
  std::expected<cv void, Return> or_else(function<std::expected<cv void, Return>(E)> func);
};

適格要件

効果

備考

or_elseは、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。

#include <cassert>
#include <expected>
#include <string>

std::expected<void, std::string> validate(int code)
{
  if (0 <= code) {
    return {};
  } else {
    return std::unexpected{"bad code"};
  }
}

int main()
{
  std::expected<void, int> v1;
  assert(v1.or_else(validate).has_value());

  std::expected<void, int> e1 = std::unexpected{42};
  assert(e1.or_else(validate).has_value());

  std::expected<void, int> e2 = std::unexpected{-100};
  assert(e2.or_else(validate).error() == "bad code");
}

出力

バージョン

言語

  • C++23

処理系

関連項目

参照