C++23ではstd::optional
にand_then
、or_else
、transform
が導入されるそうです。
and_then
はstd::optional
が有効値の場合に変換処理を実行した結果を返します。or_else
はstd::optional
が無効値の場合に変換処理を実行した結果を返します。いずれも変換処理はstd::optional
を返すことが強制されます。transform
はand_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) }
メソッドチェーンによるモナディック(モナドっぽい)操作を目的とするそうです。
関連リンク