Skip to content

Latest commit

 

History

History
110 lines (85 loc) · 4.51 KB

File metadata and controls

110 lines (85 loc) · 4.51 KB

transform

  • 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(F&& f) &;        // (1)
template<class F> constexpr auto transform(F&& f) const &;  // (2)
template<class F> constexpr auto transform(F&& f) &&;       // (3)
template<class F> constexpr auto transform(F&& f) const &&; // (4)

概要

正常値を保持していれば、fの呼び出し結果をexpectedの正常値として格納して返す。 エラー値を保持していれば、そのまま返す。

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

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

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

適格要件

  • (1), (2) : 型Uremove_cvref_t<invoke_result_t<F>>としたとき、次を全て満たすこと
    • Uexpectedの有効な正常値型である
    • Uが(CV修飾された)voidではないとき、宣言U u(invoke(std::forward<F>(f)));が妥当である
  • (3), (4) : 型Uremove_cvref_t<invoke_result_t<F>>としたとき、次を全て満たすこと
    • Uexpectedの有効な正常値型である
    • Uが(CV修飾された)voidではないとき、宣言U u(invoke(std::forward<F>(f)));が妥当である

効果

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

備考

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

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

int get_answer()
{
  return 42;
}

int main()
{
  std::expected<void, std::string> v1;
  assert(v1.transform(get_answer).value() == 42);

  std::expected<void, std::string> e1 = std::unexpected{"galaxy"};
  assert(e1.transform(get_answer).error() == "galaxy");
}
  • transform[color ff0000]
  • value()[link value.md]
  • error()[link error.md]
  • std::unexpected[link ../unexpected.md]

出力

バージョン

言語

  • C++23

処理系

関連項目

参照