Play Siv3D!

ゲームとメディアアートのための C++ ライブラリ「Siv3D」

無効値

Optional

Siv3D June 2015 v2

無効値を表現する
Optional<Type>は Type 型に無効値の表現を追加します。

# include <Siv3D.hpp>

void Main()
{
	Optional<int> a;

	Optional<int> b = 0;

	if (a) // false
	{
		Println(L"a");
	}

	if (b) // true
	{
		Println(L"b");
	}

	Println(a); // none

	Println(b); // Optional 0

	WaitKey();
}


Optional 型から値を得る
Optional::value()は T 型の値を返します。無効値の場合は例外が投げられます。
一方Optional::value_or(v)は、無効値だった場合に例外は投げず v を返します。

# include <Siv3D.hpp>

void Main()
{
	Optional<int> a;

	Optional<int> b = 0;

	if (a) // false
	{
		Println(L"a:", a.value());
	}

	if (b) // true
	{
		Println(L"b:", b.value()); // b: 0
	}

	Println(a.value_or(-1)); // -1

	Println(b.value_or(-1)); // 0

	WaitKey();
}


Optional 型に無効値を代入する
無効値はnoneで表現されます。

# include <Siv3D.hpp>

void Main()
{
	Optional<int> a;

	Optional<int> b = 0;

	if (a) // false
	{
		Println(L"a1");
	}

	if (b) // true
	{
		Println(L"b1");
	}

	Println(a); // none

	Println(b); // Optional 0

	a = 100;

	b = none;

	if (a) // true
	{
		Println(L"a2");
	}

	if (b) // false
	{
		Println(L"b2");
	}

	Println(a); // Optional 100

	Println(b); // none

	WaitKey();
}


値に関数を適用する
Optional::then(f)は、自身が無効値でない時に、その値を引数に関数 f を実行します。
Optional::then(f1, f2)は、自身が無効値でない時に、その値を引数に関数 f1 を呼び、それ以外の場合に関数 f2 を呼びます

# include <Siv3D.hpp>

void Main()
{
	Optional<int> a;

	Optional<int> b = 100;

	a.then(Println<int>);

	b.then(Println<int>); // 100

	a.then([](int a){Println(a * 100); }, [](){ Println(L"N/A"); }); // N/A

	b.then([](int a){Println(a * 100); }, [](){ Println(L"N/A"); }); // 10000

	WaitKey();
}


パラメータを特に指定しないことを明示的に示す
unspecifiedは none の別名です。

# include <Siv3D.hpp>

void Main()
{
	Optional<int> a = 100;

	Println(a); // Optional 100

	a = unspecified;

	Println(a); // none

	WaitKey();
}