• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <expected>

    std::expected.void::or_else

    // 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

    処理系

    関連項目

    参照