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

履歴 編集

function template
<expected>

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

// 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);
};

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

適格要件

  • (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)));が妥当である

効果

備考

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");
}

出力

バージョン

言語

  • C++23

処理系

関連項目

参照