Optional 型は有効な値を持つか、もしくは無効な値かを表す型です。
std::optional
型と同義ですが、C++17 からでしか使えないため Udon:Optional
型を実装しています。大まか次のように実装されています。テンプレート引数に渡された型のオブジェクト(値)を持ちます。
次のように戻り値にエラー情報を付与したい場合に用います。
有効値かどうかは hasValue()
operator bool
メンバ関数によって取得できます。
if 文の判定式にオブジェクトを渡すと、bool 型への明示的なキャストとしてコンパイルされ、operator bool
が呼び出されます。
一般的には最初の例のように書きます。変数のスコープを if 文に閉じ込められるので、よりスマートです。
値は operator *
value()
によって参照できます。
無効値の場合、値の取得はしてはならず、未定義動作となります。例外の送出できる環境では、例外オブジェクト Udon::BadOptionalAccess
がスローされます。
Optional::operator *
はポインタでの *
を模倣して定義されています。ポインタでの *
演算子はポインタ先の参照を返すのに対し、Optional::operator *
が持つ値オブジェクトへの参照を返します。
Optional が 構造体オブジェクトを持つ場合は operator->
によって構造体のメンバを直接参照できます。こちらもポインタのアロー演算子の模倣です。
通常の変数と同じように扱えます。
初期化時にセット
代入時にセット
Udon::nullopt
オブジェクトを初期化、代入時にセットすると無効値となります。
また初期値を渡さずインスタンス化した際も無効値となります。
既に有効値を持つ場合、reset
メンバ関数で無効値にできます。
本ライブラリでは Optional 型を通信受信時のエラーチェックに用いています。
受信用クラスには受信したオブジェクトを返す getMessage()
メンバ関数がありますが、この関数は受信した T
型オブジェクトを Optional<T>
で返します。
受信エラーの際は無効値を返すため、エラー処理を次のように書けます。
auto
型で受け取ると短く書けます。