potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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

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

関連リンク