potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C++23 std::optionalのand_then、or_else、transform

C++23ではstd::optionaland_thenor_elsetransformが導入されるそうです。

and_thenstd::optionalが有効値の場合に変換処理を実行した結果を返します。or_elsestd::optionalが無効値の場合に変換処理を実行した結果を返します。いずれも変換処理はstd::optionalを返すことが強制されます。transformand_thenと似たように動作しますが、変換処理の結果は自動でstd::optionalに変換されます。

#include <optional>

int main()
{
    std::optional<int> null_value;
    std::optional<int> nonnull_value(1);

    auto a = null_value.or_else([]() {return std::optional(1000); });
    auto b = nonnull_value.or_else([]() {return std::optional(1000); });
    auto c = null_value.and_then([](int x) { return std::optional(x + 100); });
    auto d = nonnull_value.and_then([](int x) { return std::optional(x + 100); });
    auto e = null_value.transform([](int x) {return x + 100; });
    auto f = nonnull_value.transform([](int x) {return x + 100; });
    // a = std::optinoal<int>(1000)
    // b = std::optinoal<int>(1)
    // c = std::optinoal<int>(std::nullopt)
    // d = std::optinoal<int>(101)
    // e = std::optinoal<int>(std::nullopt)
    // f = std::optinoal<int>(101)
}

メソッドチェーンによるモナディック(モナドっぽい)操作を目的とするそうです。

関連リンク