前書き
例えば何かを生成する関数があったとして、正常に生成された場合はその値を返せばよいのですが、その生成に失敗した場合に「仮のインスタンス/値」を返すのを避けたい場面に遭遇します。
オプション型というのはそのような「値が無い/参照がない」という状態を作り出すために使えます。
Unreal C++ / TOptional<型名>
UnrealのC++にはTOptionalというクラスが用意されています。
使い方は非常に簡単で
TOptional<int32> Number;
TOptional<int32> Number = 56
と宣言します。
値を消す / 値を設定
//リセット
Number.Reset();
//値を設定
Number.Emplace(20);
Number= 20;
値を設定する場合、もしくは値を消す場合は上記の方法で行えます。
リセット関数を呼び出すと、number変数内は空になります。これは無というイメージなので、そのまま値を使おうとすると無いものを取り出すとしてエラーが発生します。
値を設定する場合は、Emplace関数か=で出来ます。
値を取り出して実際に使う場合は
パターン1
if(Number.IsSet())
{
Use(Number.GetValue());
}
のようにIsSet関数で中身が存在するかをチェックし、その後GetValue関数で生の値を取り出すみたいな感じです。
ここでIsSet関数を呼び出さずにGetValue()を使ってしまうと、値が設定されてる場合は通常に動作するのですが、入ってない場合はエラーを吐いてクラッシュしてしまいます…。
パターン2
Use(Number.Get(0); //numberが空の場合は0が代わりに入る。
のように、引数付きのGet関数を呼び出す方法も存在します。こちらはnumberの中身が空の場合、代わりに引数に渡したデフォルト値が入るよう取り出します。
関数の戻り値
上記が主な使い方ですが、関数の戻り値としても見ていきます。
TOptional<int32> GetNumber()
{
if(Conditional)
{
return 10;
}
else
{
return TOptional<int32>();
}
}
と書く…といいたいのですが、こちらについてはあまり自身は無いです。無い状態を表すもの(nullptrのような)が見つからなかったので、何も設定していないTOptionalを返してる感じです(もし詳しい方がいれば教えていただけると助かります…)