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

履歴 編集

function template
<expected>

std::expected::and_then(C++23)

template<class F> constexpr auto and_then(F&& f) &;        // (1)
template<class F> constexpr auto and_then(F&& f) const &;  // (2)
template<class F> constexpr auto and_then(F&& f) &&;       // (3)
template<class F> constexpr auto and_then(F&& f) const &&; // (4)

概要

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

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

template <class T, class E>
class expected {
  template <class Return>
  std::expected<Return, E> and_then(function<std::expected<Return, E>(T)> func);
};

テンプレートパラメータ制約

適格要件

効果

備考

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

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

// 正数なら2倍/それ以外はエラー値を返す関数
std::expected<int, std::string> twice(int n)
{
  if (0 < n) {
    return n * 2;
  } else {
    return std::unexpected{"out of domain"};
  }
}

int main()
{
  std::expected<int, std::string> v1 = 1;
  assert(v1.and_then(twice).value() == 2);

  std::expected<int, std::string> v2 = 0;
  assert(v2.and_then(twice).error() == "out of domain");

  std::expected<int, std::string> e1 = std::unexpected{"NaN"};
  assert(e1.and_then(twice).error() == "NaN");
}

出力

バージョン

言語

  • C++23

処理系

関連項目

参照