Skip to content

Latest commit

 

History

History
104 lines (81 loc) · 4.02 KB

File metadata and controls

104 lines (81 loc) · 4.02 KB

transform_error

  • expected[meta header]
  • function template[meta id-type]
  • std[meta namespace]
  • expected.void[meta class]
  • cpp23[meta cpp]
// expected<cv void, E>部分特殊化
template<class F> constexpr auto transform_error(F&& f) &;        // (1)
template<class F> constexpr auto transform_error(F&& f) const &;  // (2)
template<class F> constexpr auto transform_error(F&& f) &&;       // (3)
template<class F> constexpr auto transform_error(F&& f) const &&; // (4)

概要

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

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

template <cv void, class E>
class expected {
  template <class Return>
  std::expected<cv void, Return> transform_error(function<Return(E)> func);
};
  • function[link /reference/functional/function.md]

適格要件

効果

  • (1), (2) : 次の効果をもつ
    • 正常値を保持していたら、expected<T, G>()を返す。
    • そうでなければ、エラー値をinvoke(std::forward<F>(f), error())で直接非リスト初期化したexpected<T, G>オブジェクトを返す。
  • (3), (4) : 次の効果をもつ
    • 正常値を保持していたら、expected<T, G>()を返す。
    • そうでなければ、エラー値をinvoke(std::forward<F>(f), std::move(error()))で直接非リスト初期化したexpected<T, G>オブジェクトを返す。

備考

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

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

std::string int2str(int n)
{
  return std::format("({})", n);
}

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

  std::expected<void, int> e1 = std::unexpected{42};
  assert(e1.transform_error(int2str).error() == "(42)");
}
  • transform_error[color ff0000]
  • has_value()[link has_value.md]
  • error()[link error.md]
  • std::unexpected[link ../unexpected.md]

出力

バージョン

言語

  • C++23

処理系

関連項目

参照